查看: 3257|回复: 3

鸿蒙 uni-app x loading 组件踩坑与暂停优化

[复制链接]
发表于 2026-9-20 11:00:00 | 显示全部楼层 |阅读模式
在 uni-app x 中,loading 是标准加载动画组件,常用于页面加载、数据请求、文件上传等场景。鸿蒙平台从 HarmonyOS 5.0 开始支持该组件,全平台也是 5.0 才支持,比其他基础组件晚。如果要兼容旧版本,需要自己用 CSS 动画实现。

一、组件能力与限制

loading 利用系统 GPU 加速渲染,官方说一个界面放 100 个同时转也不卡,原文作者实测确实如此。鸿蒙平台因 OS 渲染线程开放能力不足,loading 会受主线程轻微影响,但仍可做到一个界面 100 个 loading 同时转圈不卡顿。

组件属性较少,常用包括 bold 加粗、paused 暂停、ios-spinner 等。CSS 支持很有限,只支持 width、height、border-color、color 四个属性;margin、padding、background-color 不支持,CSS 变量也不支持。

二、常用实战写法

基础 loading 默认是 16px 大小、黑色线条、不停旋转:
  1. <template>
  2. <loading></loading>
  3. </template>
复制代码

自定义大小和颜色:
  1. <loading style="width: 40px; height: 40px; border-color: #2196F3;"></loading>
  2. <loading style="width: 24px; height: 24px; border-color: #F44336;"></loading>
  3. <loading style="width: 16px; height: 16px; border-color: #4CAF50;"></loading>
复制代码

加粗线条:
  1. <loading bold style="width: 30px; height: 30px; border-color: #2196F3;"></loading>
复制代码

暂停动画和条件显示:
  1. <loading paused style="width: 30px; height: 30px; border-color: #2196F3;"></loading>
  2. <loading v-if="isLoading" style="width: 30px; height: 30px; border-color: #2196F3;"></loading>
复制代码

loading 加文字、页面加载状态、列表加载更多、按钮 loading、深色背景 loading 等场景,本质都是布局与状态控制。按钮中可放 16px loading,border-color 用 white,并配合 disabled 防止重复提交;列表底部用 isLoadingMore 控制,加载时显示 loading 和“加载中...”;整页加载可用 v-if 切换内容;深色背景用白色 loading。

三、鸿蒙平台适配要点

HarmonyOS 5.0 才开始支持 loading,旧版本需要 CSS 动画。鸿蒙原生开发中,加载动画使用 LoadingProgress 组件:
  1. // 鸿蒙原生写法
  2. LoadingProgress()
  3. .width(40)
  4. .height(40)
  5. .color('#2196F3')
复制代码

对比来看,uni-app x 的 loading 用 CSS 控制样式,写法更灵活。

从 HBuilderX 5.0 开始,uni.showLoading API 在非小程序平台上通过 loading 组件实现。也就是说,调用 uni.showLoading() 底层其实就是渲染了一个 loading 组件。页面内某个区域在加载,用 loading 组件;整个页面在加载且需要遮罩,用 uni.showLoading。

四、踩坑记录

1. 鸿蒙 5.0 才支持。之前的版本需要自己用 CSS 动画实现。
2. 只支持很少的 CSS。loading 只支持 width、height、border-color、color 四个 CSS 属性,margin、padding、background-color 都不支持。
3. 不用时要暂停或隐藏。loading 默认旋转,如果不用了,应该用 paused 暂停或 v-if 隐藏。不要在隐藏或被遮挡的区域让 loading 持续旋转,浪费 GPU 资源。
4. ios-spinner 颜色优先级。当 ios-spinner=true 时,color 的优先级大于 border-color;当 ios-spinner=false 时,color 无效。大多数情况下用 border-color 就够了。
5. ios-spinner 大小限制。ios-spinner=true 时,由于 iOS 系统雪花非矢量,CSS width/height 超过 37px 会模糊。
6. 不支持 CSS 变量。不能用 var(--color) 这种方式设置颜色。
7. margin 需要外面套 view:
  1. <!-- 错误:margin 不生效 -->
  2. <loading style="margin: 10px;"></loading>
  3. <!-- 正确:外面套 view -->
  4. <view style="margin: 10px;">
  5. <loading></loading>
  6. </view>
复制代码

五、性能与动态控制

动态控制可以绑定 paused、bold、style。原文完整示例中,通过按钮切换暂停、加粗、放大、缩小、换色;换色时 currentColor 由 colors 数组和 colorIndex 计算,尺寸限制在 16 到 80px 之间。
  1. <loading :paused="isPaused" :bold="isBold"
  2. :style="{ width: size + 'px', height: size + 'px', borderColor: currentColor }"></loading>
复制代码

总结:loading 组件是 uni-app x 在鸿蒙平台显示加载动画的标准方案。关键点包括:全平台 5.0 才支持;利用 GPU 加速,鸿蒙平台受主线程轻微影响但 100 个同时转不卡;只支持 width、height、border-color、color 四个 CSS;paused 暂停动画,bold 加粗线条;不用时要暂停或隐藏;margin 不支持,需要外套 view;uni.showLoading 底层用的就是 loading 组件。
回复

使用道具 举报

发表于 2026-9-20 19:00:00 | 显示全部楼层

Re: 鸿蒙 uni-app x loading 组件踩坑与暂停优化

看完很受用,尤其是 loading 不用时要用 paused 或 v-if 暂停、隐藏这一点,之前很容易忽略,隐藏区域还一直转确实浪费 GPU。CSS 只支持 width、height、border-color、color,margin 要外面套 view,这个坑也很典型。ios-spinner 下 color 优先于 border-color、超过 37px 会模糊、不支持 CSS 变量,这些细节都很有参考价值。期待后面能再展开讲讲 HarmonyOS 5.0 以下用 CSS 动画兼容 loading 的具体思路和性能注意点。
回复 支持 反对

使用道具 举报

发表于 2026-9-20 19:10:00 | 显示全部楼层

Re: 鸿蒙 uni-app x loading 组件踩坑与暂停优化

感谢分享,信息很集中。几个点特别有共鸣:鸿蒙 5.0 才支持 loading,旧版本得自己上 CSS 动画,这个兼容成本确实要提前评估;CSS 只支持 width、height、border-color、color,margin 要外面套一层 view,很容易写着写着发现不生效;不用时用 paused 或 v-if,别让被遮挡的 loading 一直转,这个性能意识很重要。ios-spinner 的颜色优先级和超过 37px 会模糊也值得记一下。整体看,区域加载用 loading 组件、整页遮罩用 uni.showLoading 这个分法很清楚。收藏了,后面做鸿蒙页面试试。
回复 支持 反对

使用道具 举报

发表于 2026-9-20 19:20:00 | 显示全部楼层

Re: 鸿蒙 uni-app x loading 组件踩坑与暂停优化

感谢分享,这篇把 loading 组件在鸿蒙上的边界讲得很清楚。我印象最深的是全平台 5.0 才支持,旧版本要自己用 CSS 动画兜底,这个如果没注意很容易在低版本上直接空白。CSS 只支持 width、height、border-color、color,像 margin、padding、background-color 不支持这点也很关键,尤其 margin 必须外面套 view,不然真的会调半天没效果。还有不用时要 paused 或 v-if 隐藏,别让被遮挡的 loading 一直转,这个对性能习惯很有帮助。ios-spinner 的颜色优先级和超过 37px 会模糊也记下了,以后用 border-color 更稳。动态绑定 paused、bold、style 的写法很实用,列表加载更多和按钮 loading 的场景按这个思路控制状态就清楚了。整体总结很到位,收藏了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-7 03:11 , Processed in 0.027003 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部