鸿蒙HarmonyOS应用开发-装饰器总结

一、概述

状态管理机制:声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回结果,也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染

常用的装饰器有@Prop、@Link、@Provide、@Observed 和 @ObjectLink 装饰器

二、各个状态变量的作用

1. @Prop 装饰器

@Prop 装饰器用于定义组件的属性,并确保组件属性的类型与数据源类型相匹配。通过 @Prop 装饰的变量会进行深拷贝,这意味着即使装饰的数据发生改变,也不会影响到父组件的数据。常见问题包括装饰状态变量未初始化错误。

2. @Link 装饰器

@Link 装饰器用于实现父子组件之间的双向数据同步。被 @Link 装饰的变量与父组件对应数据建立双向绑定,确保数据的同步更新。然而,@Link 装饰器不能在 @Entry 装饰的自定义组件中使用,并且禁止本地初始化。

3. @Provide 和 @Consume 装饰器

@Provide 和 @Consume 装饰器用于实现与后代组件之间的双向数据同步。它们可以跨组件传输数据,并确保数据的双向同步。必须注意的是,@Provide 和 @Consume 装饰的变量的类型必须相同。

4. @Observed 和 @ObjectLink 装饰器

@Observed 装饰器用于观察深层次变量的变化,而 @ObjectLink 装饰器用于嵌套类对象属性的变化。@Observed 装饰的类实例会被代理对象包装,从而实现属性的更新通知。然而,需要注意的是,使用 @Observed 装饰类会改变其原始的原型链,可能会带来一些问题。

三、状态变量引起父子组件刷新问题的总结

 

装饰器使用场景子组件数据父组件的数据修改子组件UI父组件UI
@State组件内部的状态   

1. 简单类型数据-会

2. 复杂数据类型-第一层会

@Prop父组件传递给子组件 子组件不需要修改数据改变不会子组件修改-简单数据类型不会
@Observed 和 @ObjectLink子组件同步修改父组件的数据-改变改变父组件不会
@Link子组件同步修改父组件的数据-简单改变改变
@Provide @Consume祖宗后代组件之间数据同步 - 简单改变改变

每个装饰器的特点、限制条件、框架行为以及常见问题

 

装饰器特点限制条件框架行为常见问题
@Prop必须指定类型- 进行深拷贝- 不影响父组件数据初始化时类型需与数据源相同- 装饰的数据发生改变不影响父组件数据初始化时进行深拷贝- 数据发生改变时不影响父组件数据装饰状态变量未初始化错误
@Link父子双向同步- 数据与父组件建立双向数据绑定不能在@Entry装饰的自定义组件中使用- 禁止本地初始化装饰的变量与父组件共享生命周期 父组件build()函数执行后创建子组件的新实例- 父组件中状态变量更新引起相关子组件的更新 子组件中@Link更新后同步回父组件@State,触发UI更新装饰状态变量类型错误
@Provide与后代组件双向同步- 跨组件传输必须指定类型- @Provide变量与@Consume变量的类型必须相同双向数据同步- 可以通过相同变量名或别名绑定@BuilderParam尾随闭包情况下@Provide未定义错误
@Observed观察深层次变量的变化使用@Observed装饰class会改变class原始的原型链@Observed和其他类装饰器装饰同一个class可能会带来问题- 不能在@Entry装饰的自定义组件中使用初始渲染时会被代理对象包装,代理了class上的属性的setter和getter方法 子组件中@ObjectLink装饰的从父组件初始化,接收被@Observed装饰的class的实例- 属性更新时,通知依赖它的@ObjectLink包装类数据更新在子组件中给@ObjectLink装饰的变量赋值 基础嵌套对象属性更改失效 在@Observed装饰类的构造函数中延时更改成员变量
     

 

  • 30
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值