首页 > 其他分享 >HarmonyOS-基础之@Watch监听、@ObjectLink和@Observed

HarmonyOS-基础之@Watch监听、@ObjectLink和@Observed

时间:2024-04-09 23:11:49浏览次数:26  
标签:ObjectLink obj Watch number Observed Person 组件 监听

1、Watch监听

类似Vue中的数据监听,监听的数据发生了变化 --> 做啥事情

父组件

import Child07 from '../components/Child07'

@Entry
@Component
struct WatchExample {
  // watch 可以监听组件状态 State | Link | Provide ......
  @State @Watch('update') obj: {
    a: number,
    b: { c: number }
  } = { a: 123, b: { c: 456 } }

  // watch的监听回调
  update() {
    console.log('监听到obj的变化')
  }

  build() {
    Column() {
      Text('watch监听').fontSize(20)
      // 子组件
      // Child07({ obj: this.obj })
      Child07({obj:$obj})
    }.width("100%")
  }
}

子组件

@Component
export default struct Child07 {
  // Prop好像监测不到
  // @Prop obj: {
  //   a: number,
  //   b: { c: number }
  // }

  @Link obj: {
    a: number,
    b: { c: number }
  }

  build() {
    Column() {
      Text('子组件Child07获取父组件传递的数据obj:' + JSON.stringify(this.obj))
      Button('修改父组件@Watch监听的数据').onClick((event: ClickEvent) => {
        // this.obj = { a: 20, b: { c: 30 } }
        this.obj.a += 100
        // 无法深度监听
        // this.obj.b.c += 9
      })
    }
    .width('100%')
    .border({ width: 1, color: Color.White })
  }
}

image

注意:@Watch是浅监听,上面的案例也可以看出;至于深度监听的写法后面会演示

2、ObjectLink和Observed

从前面的Watch可以看出对象中的对象或者数组中的对象属性等深层次的属性变化时UI无法更新;所以ObjectLink和Observed就可以来解决这个问题了;
案例如下:

Person对象

@Observed
export class Person {
  id: number
  name: string
  age: number

  constructor(id: number, name: string, age: number) {
    this.id = id
    this.name = name
    this.age = age
  }
}

父组件

import { Person } from '../domain/Model'
import Item01 from '../components/Item01'

@Entry
@Component
struct ObjectLinkExample {
  @State userArr: Person[] = [new Person(1, 'zs', 19), new Person(2, 'ls', 23)]

  build() {
    Column() {
      Text(JSON.stringify(this.userArr)).onClick(() => {
        console.log(JSON.stringify(this.userArr))
      })
      Button('更新数据').onClick((event: ClickEvent) => {
        this.userArr[0].age += 1
      })
      ForEach(this.userArr, (item: Person, index: number) => {
        Item01({ item: item })
      })
    }.width('100%')
  }
}

子组件

import { Person } from '../domain/Model'

@Component
export default struct Item01 {
  @ObjectLink item: Person

  build() {
    Column() {
      Text('Item01子组件,通过@Observed和@ObjectLink获取到父组件传递的数据:' + JSON.stringify(this.item))
      Button('更新数据').onClick((event: ClickEvent) => {
        this.item.age += 1
      })
    }.width('100%')
    .padding(20)
    .border({ width: 1, color: Color.Red })
  }
}

image

image

标签:ObjectLink,obj,Watch,number,Observed,Person,组件,监听
From: https://www.cnblogs.com/ybbit/p/18115406

相关文章

  • FileSystemWatcher 源码执行流程
    先注册绑定事件FileSystemWatcherfileSystemWatcher=newFileSystemWatcher();fileSystemWatcher.Path=Directory.GetCurrentDirectory();fileSystemWatcher.NotifyFilter=NotifyFilters.LastAccess|NotifyFilter......
  • oppowatch4pro功能介绍 oppowatch4pro参数配置
    寰宇曲面设计:贴合手腕的微弧曲线,从屏幕中间向边缘延伸,流畅优雅,为您带来无与伦比的佩戴体验。精钢表壳与陶瓷底盖:高奢材质彰显质感,精钢一体表壳经178道工序打磨,硬朗耐用;陶瓷底盖触感细腻,尽显工艺之美。超长续航:旗舰双芯设计,提供5天全智能续航,让您摆脱频繁充电的困扰;更有14天轻......
  • 华为watchgt4手表功能介绍
    华为HUAWEIWATCHGT4智能手表,融合了科技与时尚,为用户带来全新的智能体验。搭载HarmonyOS系统,支持丰富的应用生态,让智慧生活触手可及。其46mm与41mm两种尺寸选择,配合高清AMOLED显示屏,视觉体验极佳。健康监测方面,具备心率监测、睡眠监测以及女性健康管理等全面功能,守护用户健......
  • Apple Watch 运动记录自动停止 bug All In One
    AppleWatch运动记录自动停止bugAllInOneAppleWatchS6运动记录会自动停止bugquestionshttps://discussionschinese.apple.com/thread/253879237?sortBy=besthttps://discussionschinese.apple.com/thread/251948485?sortBy=bestdemosAppleWatchS6骑行记录,......
  • 监听 watch props对象属性监听 或深度监听
    对象属性监听 props:{baseFormObj:Object,},watch:{'baseFormObj.measuresItems':{immediate:true,//如果需要组件创建时立即监听,设置为truehandler(newVal,oldVal){//当myProperty变化时,这里的代码会被执行}......
  • vue中表单修改提交前利用watch找出新数据和原来数据之间的改动
    <template><div><[email protected]="submitForm"><inputv-model="formData.name"type="text"placeholder="Name"><inputv-model="formData.email"type......
  • Error in callback for immediate watcher “chartsData“: “Error: Initialize fail
     在使用echarts提示dom未找到,原因就是当我们封装了echarts组件初始化传值时通常会造成过早调用,也就是在数据还未处理完就已经调用init函数进行初始化,此时dom还未挂载成功,就会报这个错,这里解决可以使用nextTick()函数在初始化时延时调用;this.$nextTick(()=>{this.draw......
  • C# Stopwatch
    Stopwatch:提供一组方法和属性,可以准确的测量运行时间。使用的时候需要引用命名空间:System.Diagnostics。1//创建Stopwatch实例2Stopwatchsw=newStopwatch();3//开始计时4sw.Start();5for(inti=0;i<100;i++)6{7Console.WriteLine(i);8}9......
  • C# 文件监视 FileSystemWatcher
    //官方帮助Console:https://learn.microsoft.com/zh-cn/dotnet/api/system.io.filesystemwatcher?view=net-8.0//官方帮助WPF:https://learn.microsoft.com/zh-cn/dotnet/fundamentals/runtime-libraries/system-io-filesystemwatcher/*FileSysytemWatcher类介绍用......
  • 前端问题:Watchpack Error:too many open files
    近日在前端上偶遇WatchpackError:toomanyopenfiles这一奇葩问题,经过一番检索,先将修复过程记录.核心问题:WatchpackError(watcher):Error:EMFILE:toomanyopenfiles,watch'/home/bizuser/work/net-work/abp02/angular/node_modules/@babel/runtime/helpers'W......