当前位置:   article > 正文

鸿蒙开发之状态管理@Observed和@ObjectLink_鸿蒙 observed

鸿蒙 observed

一、使用场景

当对象内引用对象,改变内部对象属性的时候其他状态管理如@State、@Provide、@Consume等是无法触发更新的。同样,在数组内如果有对象,改变对象的属性也是无法更新的。在这种情况下就可以采用@Observed和@ObjectLink装饰器了。

二、使用方式

在我们需要监控的对象组件使用@Observed装饰,将需要变更的地方抽取出来作为一个新的组件,新组件内部引用对象使用@ObjectLink装饰。

例如, 在案例代码 这个基础上,我们需要在点击任务完成的时候,修改任务列表卡片的文字颜色,并中划线。这就涉及到了修改任务数组中Task对象的属性,需要更新UI。就需要@Observed和@ObjectLink结合使用。

 show code (在案例代码基础上做处理)

  1. //需要监控的组件使用@Observed装饰
  2. @Observed
  3. class Task {
  4. static id: number = 1
  5. name:string = '任务名称'+Task.id++
  6. finished:boolean = false
  7. }

抽离之前任务列表的item为一个新组件

  1. @Component
  2. struct TaskItem {
  3. //接收父组件中传递的task,使用@ObjectLink装饰
  4. @ObjectLink task: Task
  5. //父组件中处理数据更新的方法
  6. handTasks: () => void
  7. build() {
  8. Row() {
  9. if (this.task.finished) {
  10. Text(this.task.name)
  11. .tasksuccessed()
  12. } else {
  13. Text(this.task.name)
  14. }
  15. Checkbox()
  16. .select(this.task.finished)
  17. .onChange(value => {
  18. this.task.finished = value
  19. console.log('任务状态' + value + '')
  20. this.handTasks()
  21. })
  22. }
  23. .card()
  24. .justifyContent(FlexAlign.SpaceBetween)
  25. }
  26. }
  1. //父组件中的任务列表
  2. List({ space: 10 }) {
  3. ForEach(this.tasks, (task: Task, index) => {
  4. ListItem() {
  5. //将父组件的渲染交给新组件
  6. TaskItem({task:task,handTasks:this.handleTaskNumber.bind(this)})
  7. }
  8. .swipeAction({ end: this.deleteButton(index) })
  9. }, item => '' + item.name)
  10. }

其中,需要注意的第一点,传递父组件的方法时,传递的是this.handleTaskNumber没有()。如果传递()就表示方法调用了。

需要注意第二点,我们在将父组件方法传递给子组件的时候。如果没有bind(this)处理,默认调用的父组件方法的this就是子组件。所以,我们需要bind(this)永远使用父组件来调用父组件的方法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/240091?site
推荐阅读
相关标签
  

闽ICP备14008679号