首页 > 其他分享 >九、@Watch装饰器:状态变量更改通知

九、@Watch装饰器:状态变量更改通知

时间:2023-12-14 09:57:37浏览次数:29  
标签:count 函数 更改 Watch 状态变量 回调 装饰

@Watch应用对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量这种回调函数。

@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。@Watch在ArkUI框架内部判断数值有无更新使用的是严格相等(===),遵循严格相等规范。当在严格相等为false的情况下,就会触发@Watch的回调。

装饰器说明

@Watch补充变量装饰器 说明
装饰器参数 必填,常量字符串,字符串需要有引号,是(string)=>void自定义成员函数的方法的引用。
可装饰的自定义组件变量 可监听所有装饰器的状态变量。不允许监听常规变量。
装饰器的顺序 建议@State、@Prop、@Link等装饰器在@Watch装饰器之前。

语法说明

类型 说明
(changedPropertyName?:string)=>void

该函数是自定义组件的成员函数,changedPropertyName是被watch的属性名,

在多个状态变量绑定同一个@Watch的的回调方法的时候,可以通过changedPropertyName

进行不同的逻辑处理,将属性名作为字符串输入参数,不返回任何内容。

 

观察变化和行为表现

1.当观察到状态变量的变化(包括双向绑定的AppStorage和LocalStorage中对应的key发生的变化)的时候,对应的@Watch的回调方法将被触发。

2.@Watch方法在自定义组件的属性变更之后同步执行。

3.如果在@Watch的方法里面改变了其他的状态变量,也会赢球状态变更和@Watch的执行。

4.在第一次初始化的时候,@Watch装饰的方法不会被调用,即认为初始化不是状态变量的改变。只有在后续状态改变时,才会调用@Watch回调方法。

限制条件

1.建议开发者避免无限循环。循环可能是因为在@Watch的回调方法中直接或间接地修改了同一个状态变量引起的,为了必满循环的产生,建议不要在@Watch的回调函数里修改当前装饰的状态变量;

2.开发者应关注性能,属性值更新函数会延迟组件的重新渲染,因此,回调函数应该仅执行快速运算;

3.不建议在@Watch函数中调用async await,因为@Watch设计的用途是为了快速的计算,异步行为可能会导致重新渲染速度的性能问题;

案例代码

/**
 * author:创客未来
 * copyright:com.ckFuture.hrb
 * @Watch 装饰器  状态数据
 * @Watch的回调(监视)函数中(此处指change函数)中,不要不要不要修改被监视的状态变量。
 *          我们要操作的是其他的业务逻辑。
 */
@Entry
@Component
struct WatchDet {
  @State @Watch('change') count: number = 1
  @State pow:number  = 2
  @State res:number  = 1

  //回调函数(监视函数)
  change(){
    //出现死循环。。。。
    //this.count = this.count + 2
    //计算次幂的结果 Math.pow(基数,次幂数)
    this.res = Math.pow(this.count,this.pow)
  }

  build() {
    Row() {
      Column() {
        Text('基数:' + this.count)
          .fontSize(50)
          .onClick(() => {
            this.count++
          })
        Divider()
        Text(`次幂:${this.pow}`)
          .fontSize(50)
        Divider()
        Text("结果:" + this.res)
          .fontSize(50)
      }
      .width('100%')
    }
    .height('100%')
  }
}

 

标签:count,函数,更改,Watch,状态变量,回调,装饰
From: https://www.cnblogs.com/ckfuture/p/17900502.html

相关文章

  • 购物车页面,根据选中的商品来动态更改总价格
    一、前端代码首先引入:import{ref,computed}from'vue'将checked数组更新为响应式引用,使用ref()函数:constchecked=ref([])使用v-model将checked数组绑定到van-checkbox组件上:<van-checkbox:name="item.cartID"checked-color="#ff5d4e"v-mod......
  • Linux history记录数更改
    如果为了安全我们只需要保留200条,怎么办呢?我们可以临时修改最大保留条数:HISTSIZE=200 这样就修改成了200条啦,但是重启服务器后,又还原了。如果想一直保留200条,我们需要在/etc/profile修改他的环境变量;可以使用vim编辑(推荐使用vim编辑),也可以使用sed直接修改。命令如下:[root@5201......
  • 鸿蒙Watch 页面跳转
    新建页面config.json回自动注册添加跳转<buttontype="capsule"onclick="toStatusMonitor">状态检测</button>写跳转方法importrouterfrom'@system.router';exportdefault{data:{},onInit(){},onShow(){},......
  • 磁盘占用率100%做过的更改
    https://zhuanlan.zhihu.com/p/353963603https://zhuanlan.zhihu.com/p/258751945https://zhuanlan.zhihu.com/p/417616802https://blog.csdn.net/qq_44720952/article/details/125039718https://zhuanlan.zhihu.com/p/107449941www.3gbizhi.comhttps://www.zhihu.com/q......
  • 【Docker】更改docker镜像的存储路径
    1.查看Docker存储路径dockerinfo|grep"DockerRootDir"2.关闭所有运行的容器···dockerps|awk'{print$1}'|xargsdockerstop···3.停止docker服务systemctlstopdocker4.新增的磁盘挂载点上新建目录,并将原有的docker容器和镜像全部拷贝过来,比如这里新增......
  • 100G大表Alter更改表结构技术方案探讨
    JAVA研发需求:需要对A表的XXX字段扩容至varchar(500)目前的现状:线上A表有100G+的数据,如果直接modifyXXXvarchar(500),会锁全表,即使用pt-osc工具凌晨搞,预估一宿加不完,并且从库会出现大面积延迟,读取的数据将不准确。https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-opera......
  • swing的图像更改的这个这个额叫啥来着,就是文件??差不多
    首先还是展示架构image用来存储图片,api请求token,changecode用来存放图片转base64的代码(base64->changecode),ui放界面,mian用于启动!!,其余是百度图像的专用工具,你们申请然后使用人家的接口时就能看到image文件夹存储图片,里边的不叫image的是基础图片,他们经过转换都叫image。 然后......
  • npm和yarn更改依赖包全局下载和缓存路径
    背景在工作中遇到公共构建机器频繁编译打包失败的情况。经过排查是该机器没有权限访问npm默认下载和缓存路径。解决方案1.赋予该机器权限以解决此问题。2.参考了 npm和yarn更改依赖包全局下载和缓存路径。该方法通过修改npm和yarn的配置,改变了下载和缓存路径。#npmnpmcon......
  • Windows使用命令行方法,实现docker默认安装目录修改及更改docker镜像默认保存路径
    一、使用软连接方法,修改Docker默认安装目录查看Windows上安装DockerDesktop官方安装指南:https://docs.docker.com/desktop/install/windows-install/  1、提前在D盘新建Program\Docker,使用这行代码安装:"DockerDesktopInstaller.exe"install--installation-dir......
  • matlab在图像中随机更改像素值程序
    I=imread('C:\Users\wangd\Desktop\result3.png');%m=rgb2gray(I);%r=unidrnd(255,1,100);%产生一个1*100的数组,数组中的值为1至255中的随机值%r1=randi([2,7],10,100);%在开区间(2,7)生成10*100型随机矩阵subplot(2,2,1);imshow(I);title('原始图像');forw=1:......