当前位置: 首页 > news >正文

HarmonyOS-ArkUI: 自定义组件冻结功能@ComonentV2 freezeWhenInactive属性

@ComponentV2 装饰器是可以接收参数的,叫freezeWhenInactive, 顾名思义,就是当组件变成Inactive的时候,冻结。其默认值是false。所以如果您没有传参数时,默认不冻结。

冻结到底是一种什么状态呢?说简单点就是状态变量不响应更新。@Monitor修饰的那些状态变量更新检测逻辑也自然不会被回调。

那么为什么要给组件加一种冻结状态呢?

组件冻结功能存在的意义

最重点的原因就是性能优化。想象一种非常复杂的场景,里面有很复杂的界面,当一个状态变量绑定了很多的组价时,当状态变量发生变化,就很可能触发大量的UI刷新。造成界面卡顿。比如:

  • 导航组件中的页面发生跳转之后,即使之前的页面已经是不可见的状态了,但是被隐藏的界面中的状态变量发生了更新,却依然会触发UI刷新。我们晓得,通常数据是从服务端请求下来的,什么时候数据到位我们也不是绝对可控的。此时界面已经被用户操作到什么界面了,我们也并非完全可控。有时候数据来了,界面却不需要了。这个很多时候会发生的,也是我工作经验中总结的比较容易出bug的地方,(在Andorid中的基类,或者Fragment基类中,通常研发会补写一种当前页面状态查询方法,大抵原因就是为了应付这种数据页面不对称的问题,但是仍需要子类写一些具体的判断场景,比较麻烦)。这里无论是从性能上,还是从代码的健壮性上,其实都需要拦一道的。freezeWhenInactive,恰恰能够使得@ComponentV2具备"拦一道"的能力。
  • 长列表在滚动时,不可见的列表项目仍然持续响应数据的变化,从而消耗了计算资源。
freezeWhenInactive 中的“Inactive”指的是?

这里我稍微扣一下字眼,毕竟源码开发人员,不可能乱起属性名的。当组件处于Inactive的时候就冻结。 那么?Inactive状态具体指的组件是什么状态呢?结果是,不同的组件有各自的inactive标准时刻。看来没白扣。

  • 在页面路由代码场景中,非栈顶的界面,是inactive状态
  • 在Navigation导航组件的使用场景中,未显示的NavDestination组件,是inactive状态。
  • 在TabContent组件中,非当前Tab中的组件,是inactive状态。
冻结行为表征
  • 一旦组件发生了冻结,则其内部包含的所有状态变量更新,都不会触发UI的刷新。@Monitor监视器也不会执行。
  • 但是当界面恢复了active状态的时候,ArkUI框架便会自动补发之前最后的更新值,从而确保UI的正确性。

自定义组件冻结的使用及表现特征

自定义组件冻结能力的使用通常用在以下三大场景

  • 页面路由场景
  • Tab页, TabC

相关文章:

  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Health Service Kit
  • 【cocos creator 3.x】速通3d模型导入, 模型创建,阴影,材质使用,模型贴图绑定
  • Electricity Market Optimization 探索系列(V)
  • Ubuntu 部署 DeepSeek
  • 条款05:了解C++默默编写并调用哪些函数
  • 【工具】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~
  • 【Netty篇】Handler Pipeline 详解
  • linux多线(进)程编程——(8)多进程的冲突问题
  • 【Contiki】Contiki源码目录结构
  • Android启动初始化init.rc详解
  • PotPlayer在AMD 25.3.1以上时出现画面不动问题
  • FreeBSD系统使用 ZFS 添加交换空间swap
  • 【C++】特化妙技与分文件编写 “雷区”
  • 前端渲染pdf文件解决方案
  • 免杀对抗-Webshell篇
  • 2.4 函数的运行原理
  • 常用 Git 命令详解
  • 关于视频的一些算法内容,不包含代码等
  • 计算serise数据的唯一值数量
  • 【2-12】CRC循环冗余校验码
  • 王毅同印度国家安全顾问多瓦尔通电话
  • 体验中国传统文化、采购非遗文创,波兰游客走进上海市群艺馆
  • 巴基斯坦军方:印度导弹袭击巴首都附近空军基地
  • 人民日报钟声:平等对话是解决大国间问题的正确之道
  • 屈晓华履新四川省社科联党组书记,此前担任省国动办主任
  • 新华时评:直播间里“家人”成“韭菜”,得好好管!