当前位置: 首页 > news >正文

OpenHarmony 入门——ArkUI 自定义组件内同步的装饰器@State小结(二)

文章大纲

  • 引言
  • 一、组件内状态装饰器@State
    • 1、初始化
    • 2、使用规则
    • 3、变量的传递/访问规则说明
    • 4、支持的观察变化的场景
    • 5、@State 变量的值初始化和更新机制
    • 6、State支持联合类型实例

引言

前一篇文章OpenHarmony 入门——ArkUI 自定义组件之间的状态装饰器小结(一)简单复述了下,这一篇就好好学习下装饰器的语法和用法。

一、组件内状态装饰器@State

@State装饰的变量即状态变量,一旦变量拥有了状态属性,就可以触发其直接绑定UI组件的刷新。当状态改变时,UI会发生对应的渲染改变。**@State是最基础的,使变量拥有状态属性的装饰器,它也是大部分状态变量的数据源。**换言之,任一组件内部自己去通过数据驱动自身UI更新的,只需要把常规变量加上@State修饰即可。

1、初始化

@State装饰的变量,与声明式范式中的其他被装饰变量一样,是私有的且只能从组件内部访问,在声明时必须指定其类型和本地初始化,初始化也可选择使用命名参数机制从父组件完成初始化。@State装饰的变量生命周期与其所属自定义组件的生命周期相同。

2、使用规则

在这里插入图片描述

3、变量的传递/访问规则说明

在这里插入图片描述

4、支持的观察变化的场景

并非状态变量的所有更改都会引起UI的刷新,只有可以被框架观察到的修改才会引起UI刷新。以下的修改可被观察到以及观察到变化后触发ArkUI框架刷新UI。

  • 数据类型为boolean、string、number被修饰时可以观察到数值的变化。
  • 数据类型为class或者Object时,可以观察到自身的赋值的变化及其属性赋值的变化,即Object.keys(observedObject)返回的所有属性。
  class ClassA {public value: string;constructor(value: string) {this.value = value;}}class Model {public value: string;public name: ClassA;constructor(value: string, a: ClassA) {this.value = value;this.name = a;}}// State装饰的类型是Model
@State title: Model = new Model('Hello', new ClassA('World'));
// class类型赋值可被观察到
this.title = new Model('Hi', new ClassA('ArkUI'));
// class属性的赋值 可被观察到
this.title.value = 'Hi';// XXXXXX嵌套的属性赋值观察不到XXXXXXX
this.title.name.value = 'ArkUI';
  • 数据类型为array时,可以观察到数组本身的赋值和添加、删除、更新数组的变化
class Model {public value: number;constructor(value: number) {this.value = value;}
}
// 数组类型
@State title: Model[] = [new Model(11), new Model(1)];
// 数组赋值
this.title = [new Model(2)];
// 数组项赋值
this.title[0] = new Model(2);
// 数组项更改
this.title.pop();
// 数组项更改
this.title.push(new Model(12));
// XXXXXXXXX嵌套的属性赋值观察不到
this.title[0].value = 6;
  • 当装饰的变量是Map时,可以观察到Map整体的赋值,同时可通过调用Map的接口set, clear, delete 更新Map的值。详见装饰Map类型变量。

  • 当装饰的变量是Set时,可以观察到Set整体的赋值,同时可通过调用Set的接口add, clear, delete 更新Set的值。详见装饰Set类型变量。

  • 当装饰的对象是Date时,可以观察到Date整体的赋值,同时可通过调用Date的接口setFullYear, setMonth, setDate, setHours, setMinutes, setSeconds, setMilliseconds, setTime, setUTCFullYear, setUTCMonth, setUTCDate, setUTCHours, setUTCMinutes, setUTCSeconds, setUTCMilliseconds 更新Date的属性。

5、@State 变量的值初始化和更新机制

  • 当状态变量被改变时,查询依赖该状态变量的组件;
  • 执行依赖该状态变量的组件的更新方法,组件更新渲染;
  • 和该状态变量不相关的组件或者UI描述不会发生重新渲染,从而实现页面渲染的按需更新。

6、State支持联合类型实例

@State支持联合类型和undefined和null,在下面的示例中,count类型为number | undefined,点击Button改变count的属性或者类型,视图会随之刷新。

@Entry
@Component
struct EntryComponent {build() {Column() {MyComponent()}}
}@Component
struct MyComponent {@State count: number | undefined = 0;build() {Column() {Text(`count(${this.count})`)Button('change').onClick(() => {this.count = undefined;})}}
}

更多例子请参见后续文章。

http://www.lryc.cn/news/463240.html

相关文章:

  • 【Linux驱动开发】嵌入式Linux驱动开发基本步骤,字符设备开发入门,点亮LED
  • 搬砖14、Python网络编程入门
  • Transformer: Attention is All you need
  • C++:排序算法
  • 期货日内稳赢策略:双15交易法详解
  • 2024年10月第2个交易周收盘总结:怎样卖出!
  • mysql 不支持utf8mb4_0900_ai_ci
  • 第10篇:防火墙与入侵检测系统
  • Jmeter监控服务器性能
  • 通过前端UI界面创建VUE项目
  • Python网络爬虫:分析淘宝商品热度与销量[进阶深度优化]
  • golang从http请求中读取xml格式的body,并转成json
  • RestTemplate 学习笔记
  • 数据抓取时,使用动态IP要注意哪些?
  • C++类的构造函数
  • 第21~22周Java主流框架入门-Spring 3.SpringJDBC事务管理
  • C++ —— 类和对象
  • 安全见闻笔记
  • visual studio使用vcpkg无法定位程序输入点于XXX动态链接库***.dll上
  • 如何保护您的服务器免受 POODLE SSLv3 漏洞的影响
  • 如何用pyhton修改1000+图片的名字?
  • 使用fpm工具制作Vim.rpm包
  • Dorado7 全局缓存当前登录人信息 localStorage
  • 【2024最新版】网络安全学习路线-适合入门小白
  • 高可用之限流-07-token bucket 令牌桶算法
  • 软件测试学习笔记丨Pycharm运行与调试
  • flask基础学习
  • 【SSM详细教程】-04-Spring基于注解的组件扫描
  • Keepalived:构建高可用性的秘密武器
  • 【C++刷题】力扣-#228-汇总区间