相关问题
HarmonyOS 消息通知与状态颜色修改
441浏览 • 1回复 待解决
ArkUI节点模型和渲染机制
1223浏览 • 1回复 待解决
WebView进程模型和渲染机制是什么
2135浏览 • 1回复 待解决
#鸿蒙通关秘籍#HML列表渲染与高效渲染
94浏览 • 1回复 待解决
父组件如何与孙子组件进行状态同步
2708浏览 • 1回复 待解决
ArkTS异步机制与执行顺序
1525浏览 • 1回复 待解决
Flutter 的Texture组件如何与HarmonyOS进行关联后渲染?
174浏览 • 1回复 待解决
#鸿蒙通关秘籍#HML条件渲染与优化渲染策略
74浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何管理和渲染HarmonyOS Next组件中的状态?
134浏览 • 1回复 待解决
HarmonyOS组件通信机制
395浏览 • 1回复 待解决
HarmonyOS setWindowSystemBarProperties修改状态栏颜色
40浏览 • 1回复 待解决
如何在自定义组件的构建流程里跟踪组件数据或者状态,如在build里增加日志跟踪状态变量等
1935浏览 • 1回复 待解决
修改页面状态栏颜色,以及沉浸式状态属性设置
2863浏览 • 1回复 待解决
如何动态修改状态栏和状态栏字体颜色
2119浏览 • 1回复 待解决
HarmonyOS 修改状态栏颜色不生效
311浏览 • 1回复 待解决
HarmonyOS 状态栏的颜色如何修改
38浏览 • 1回复 待解决
鸿蒙怎么 修改状态栏字体颜色
12475浏览 • 1回复 待解决
HarmonyOS 动态渲染,组件形态能否实现动态渲染
370浏览 • 1回复 待解决
使用LazyForEach渲染语法渲染组件,UI不刷新。
1103浏览 • 1回复 待解决
在自定义组件Page的build方法里改变状态变量会造成什么影响?
469浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何在HarmonyOS中实现条件渲染与循环渲染以优化UI界面?
129浏览 • 1回复 待解决
Image组件是否有缓存机制
1281浏览 • 1回复 待解决
ArkUI ETS 开发 App 怎么修改状态栏颜色?
4071浏览 • 1回复 待解决
#鸿蒙通关秘籍# 在HarmonyOS中如何实现瀑布流组件的数据删除与增加的通知机制?
82浏览 • 0回复 待解决
#鸿蒙通关秘籍#非同层渲染与同层渲染在鸿蒙框架中的性能差异如何?
114浏览 • 1回复 待解决
组件的创建,销毁和更新阶段
组件创建和销毁过程是一个组件入栈和出栈的顺序,创建过程对组件树结构采用深度优先方式遍历,入下图所示,遍历顺序为:1-2-3-4-5-6-7-8-9
组件创建阶段
组件销毁阶段
组件更新
组件更新采用最小更新原则,父组件状态变更并触发build方法时,同样采用深度优先方式遍历。
组件更新由组件状态控制,ArkTS提供了多维度的状态管理机制,在UI开发框架中,和UI相关联的数据,不仅可以在组件内使用,还可以在不同组件层级间传递,比如父子组件之间、爷孙组件之前,也可以是全局范围内的传递。另外,从数据的传递形式来看,可分为只读的单向传递和可变更的双向传递。开发者可以灵活的利用这些能力来实现数据和UI的联动。
从父组件中的变量(下)到子组件中的变量(右)
@State
@Link
@Prop
常规变量
@State
不允许
允许
允许
允许
@Link
不允许
允许
不推荐
允许
@Prop
不允许
不允许
允许
允许
@StorageLink
不允许
允许
不允许
允许
@StorageProp
不允许
不允许
不允许
允许
常规变量
允许
不允许
不允许
允许
父组件(状态变更) --> 子组件
1. 当子组件未定义状态变量时(只定义常规变量或未定义变量),父组件执行build方法,将不会触发子组件的build
2. 当子组件中定义了状态变量,不管是否是由父组件赋值已经子组件是否使用,父组件的build方法执行时,都将触发子组件build
3. 组件定义的状态变量在build中未使用,当前组件状态变化时,build方法不会执行,但是使用@Prop时有下述例外情况
父组件状态变量,在组件内其他地方未使用时,仅作为子组件的属性传递时,使用@Prop的子组件在触发build方法前,会调用父组件也会调用build,但@Link不存在该情况
子组件(状态变更) --> 父组件
仅有@Link修改的状态变量可以同步给父组件,@Prop状态修改仅在当前组件及其子组件生效
使用ForEach遍历Array<class>类型状态变量时,Array数据结构做增、删和替换操作都会触发组件更新,但是以下情况下ForEach内@Component装饰子组件无法更新:
1. 若只需要修改Array某一项class中的属性,形如arr[0].name = xxx方式修改,不会触发当前组件及子组件build方法(当前组件build不执行,子组件也不执行)
2. 修改array中某项数据arr[0] = xxx,该项数据作为ForEach中第三个参数唯一索引没有变化,则子组件也无法重渲染(当前组件build执行,子组件不执行)
使用@Observe和@ObjectLink可以避免该问题
修改Array<class>数据类型class中某个属性,页面初始化动作如下图所示
@State修改的状态变量作为复杂数据时,往下传递其中部分属性,子组件可以使用下列方式接收
基本数据类型:@Prop, @State
引用数据类型:@ObjectLink/@Observe, @State