鸿蒙4.0开发笔记之ArkTS装饰器语法基础之监听者模式@Watch案例讲解(十四)

1、@Watch定义

@Watch实际是指状态变量更改通知。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量设置回调函数(监听函数)。

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

2、作用

(1)简单来说就是观察变化和行为表现。当观察到状态变量的变化(包括双向绑定的AppStorageLocalStorage中对应的key发生的变化)的时候,对应的@Watch的回调方法将被触发;

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

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

(4)如果在@Watch的方法⾥改变了其他的状态变量,也会引起状态变更和@Watch的执行。

3、限制条件和注意点

(1)建议开发者避免无限循环。循环可能是因为在@Watch的回调方法里直接或者间接地修改了同⼀个状态变量引起的。为了避免循环的产生,建议不要在@Watch的回调方法里修改当前装饰的状态量;也就是说不能修改被@State和@Watch同时修饰的状态变量。需要修改的应该是其他的业务逻辑代码。如下为错误示范:

//错误示范
@State @Watch('change') count_n:number = 1

  change(){
    this.count_n++
  }

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

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

4、练习

(1)练习任务
实现一个底数的次方计算,提供按钮底数可以逐渐加1,指数也可以加1,计算出底数的指数次幂,并提供指数和底数清空的按钮。

(2)练习代码

@Entry
@Component
struct Watch_cal {
  message: string = '@Watch监视'
  //用State修饰的状态变量必须初始化值
  @State @Watch('change') count_n:number = 1
  //坑:由于指数也会发生变化,因此需要对指数pow也进行Watch监视,监视函数可以使用同一个
  @State @Watch('change') pow:number = 1  //存储指数
  @State res:number = 1 //存储返回结果

  //添加了Watch监听者,就必须添加监听函数
  change(){
    //调用Math库函数,计算count_n的pow次方
    this.res= Math.pow(this.count_n, this.pow)
  }

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)

        Divider()
        Divider()
        Row(){
          Text('底数:'+this.count_n)
            .fontSize(40)
            Button('加1')
              //创建点击事件:底数自加
              .onClick(()=>{
                this.count_n++
              })
        }

        Row(){
          Text("指数:"+this.pow)
            .fontSize(40)
          Button('加1')
            //创建点击事件:指数自加
            .onClick(()=>{
              this.pow++
            })
        }

        Divider()
        Text(`结果:${this.res}`)
          .fontSize(40)

        Button('清空')
          //创建点击事件
          .onClick(()=>{
              this.count_n= 0
              this.pow= 0
              this.res= 0
          })


      }
      .width('100%')
    }
    .height('100%')
  }
}

(3)测试效果
4.3.1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/218162.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop实验putty文件

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 很多朋友反馈做hadoop实验中的putty找不到Connection-SSH-Auth路径下找不到Private key for authentication私有密钥,无法将转…

非标设计之气缸类型

空压机: 空压机又称空气压缩机,简单来说就是将机械能转化为压力能来进行工作的,空压机在电力行业应用比较多,除了在电力行业应用较多外,其实空压机还有一个比较常见的用途就是用来制冷和分离气体,输送气体…

EM32DX-C4【C#】

1外观: J301 直流 24V 电源输入 CAN0 CAN0 总线接口 CAN1 CAN1 总线接口 J201 IO 接线段子 S301-1、S301-2 输出口初始电平拨码设置 S301-3~S301-6 模块 CAN ID 站号拨码开关 S301-7 模块波特率拨码设置 S301-8 终端电阻选择开关 2DI: 公共端是…

Gson 自动生成适配器插件

在json解析方面 我们常见有下面几方面困扰 1. moshi code-gen能自动生成适配器,序列化效率比gson快,但是自定义程度不如gson,能java kotlin共存 且解决了默认值的问题 2.gson api 强大自由,但是 第一次gson的反射缓存比较慢,而且生成对象都是反射,除非主动注册com.google.gson…

SQL Sever 基础知识 - 数据筛选(1)

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…

翻译: 生成式人工智能的工作原理How Generative AI works

ChatGPT 和 Bard 等系统生成文本的能力几乎像魔法一样。它们确实代表了 AI 技术的一大步进。但是文本生成到底是如何工作的呢?在这个视频中,我们将看看生成式 AI 技术的底层原理,这将帮助你理解你可以如何使用它,以及何时可能不想…

免费的SEO外链发布工具,提升排名的利器

互联网已经成为信息传播和商业发展的重要平台。而对于拥有网站的个人、企业来说,如何让自己的网站在搜索引擎中脱颖而出?SEO(Search Engine Optimization)作为提高网站在搜索引擎中排名的关键手段. 什么是SEO外链? S…

【数据结构】最短路径——Floyd算法

一.问题描述 给定带权有向图G(V,E),对任意顶点 V (ij),求顶点到顶点的最短路径。 转化为: 多源点最短路径求解问题 解决方案一: 每次以一个顶点为源点调用Dijksra算法。时间复杂…

根据已有安装的cuda配置合适的pytorch环境

目前网络上根据电脑配置安装合适的深度学习环境的帖子已经很多了,但是现实中会出现很久之前已经安装了对应的cuda,但是现在忘记了当时安装的是什么版本。本文针对这一问题展开攻略。 1 cuda安装版本查询 我们在查询自己应该安装什么版本的cuda时&#…

前端——html拖拽原理

文章目录 ⭐前言⭐draggable属性💖 api💖 单向拖动示例💖 双向拖动示例 ⭐总结⭐结束 ⭐前言 大家好,我是yma16,本文分享关于 前端——html拖拽原理。 vue3系列相关文章: vue3 fastapi 实现选择目录所有文…

仅 CSS 阅读进度条

为了构建一个阅读进度条,即显示用户向下滚动时阅读文章的进度,很难不考虑 JavaScript。但是,事实证明,您也可以使用纯 CSS 构建阅读进度条。 从本质上讲,一个名为 animation-timeline 的新实验性 CSS 属性可以让你指定…

【工具使用-Audition】如何使用Audition频谱分析

一,简介 本文以Audition 2020为例,介绍如何生成频谱分析的图像。 二,操作步骤 使用快捷键“shift D” 三,总结 本文主要介绍如何查看频谱分析,供参考。

dll动态链接库【C#】

1说明: 在C#中,dll是添加 【类库】生成的。 2添加C#的dll: (1)在VS中新建一个Windows应用程序项目,并命名为TransferDll。 (2)打开Windows窗体设计器,从工具箱中为窗体添加相应的控件。 (3)在该应用程序的“解决方案资源管理”中的“引用”文件上单击鼠标右键, 在…

沐风老师3DMAX拼图随机生成器Puzzle建模工具使用教程

3DMAX拼图随机生成器Puzzle建模工具使用教程 3DMAX拼图随机生成器Puzzle,是一款用MAXScript脚本语言开发的3dsMax小工具,可以随机创建可编辑多边形3D拼图对象。可批量生成阵列。 【适用版本】 3dMax2015-2024(不仅限于此范围) 【…

【Unity动画】Unity 动画播放的流程

本文以2D为案例,讲解Unity 播放动画的流程 准备和导入2D动画资源 外部导入序列帧生成的 Unity内部制作的 外部导入的3D动画 2.创建动画过程 打开时间轴Ctrl6 选中场景中的一个未来需要播放动画的物体 回到时间轴点击Create一个新动画片段 拖动2D动画资源放入…

探索图像生成中的生成对抗网络 (GAN) 世界

一、介绍 生成对抗网络(GAN)的出现标志着人工智能领域的一个重要里程碑,特别是在图像生成领域。GAN 由 Ian Goodfellow 和他的同事于 2014 年提出,代表了机器学习中的一种新颖方法,展示了生成高度逼真和多样化图像的能…

专业做除甲醛净化器的品牌 甲醛净化器什么牌子最好用

室内产生了超标的甲醛,大部分都会采取选择甲醛空气净化器来去除,甲醛净化器逐渐成为室内清除甲醛的主力,在选择甲醛净化器时,人们常常会被市场上琳琅满目的空气净化器品牌所迷惑,各品牌和型号都声称自己最好&#xff0…

❀dialog命令运用于linux❀

目录 ❀dialog命令运用于linux❀ msgbox部件(消息框) yesno部件(yesno框) inputbox部件(输入文本框) textbox部件(文本框) menu部件(菜单框) fselect部…

Python---面向对象的基本概念

对象 对象,object,现实业务逻辑的一个动作实体就对应着OOP编程中的一个对象! 所以:① 对象使用属性(property)保存数据!② 对象使用方法(method)管理数据! …

PyQt实战 创建一个PyQt5项目

前后端分离 参考链接 PyQt5实战(二):创建一个PyQt5项目_pyqt5实战项目_笨鸟未必先飞的博客-CSDN博客 项目目录 创建一个QT项目 调用pyuic工具将dialog.ui文件编译为Python程序文件ui_dialog.py。 # -*- coding: utf-8 -*-# Form implemen…
最新文章