首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

鸿蒙ArkUI组件化开发系列—组件内状态@State装饰器

  • 25-03-03 08:41
  • 2026
  • 7862
blog.csdn.net

  目录

概述

装饰器使用规则说明

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

观察变化和行为表现

观察变化

框架行为

使用场景

装饰class对象类型的变量

最后


@State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就和自定义组件的渲染绑定起来。当状态改变时,UI会发生对应的渲染改变。

在状态变量相关装饰器中,@State是最基础的,使变量拥有状态属性的装饰器,它也是大部分状态变量的数据源。

说明
从API version 9开始,该装饰器支持在ArkTS卡片中使用。

概述

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

@State装饰的变量拥有以下特点:

  • @State装饰的变量与子组件中的@Prop装饰变量之间建立单向数据同步,与@Link、@ObjectLink装饰变量之间建立双向数据同步。
  • @State装饰的变量生命周期与其所属自定义组件的生命周期相同。 装饰器使用规则说明

装饰器使用规则说明

在这里插入图片描述

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

在这里插入图片描述
图1 初始化规则图示

在这里插入图片描述

观察变化和行为表现

并不是状态变量的所有更改都会引起UI的刷新,只有可以被框架观察到的修改才会引起UI刷新。该小节去介绍什么样的修改才能被观察到,以及观察到变化后,框架的是怎么引起UI刷新的,即框架的行为表现是什么。

观察变化

  • 当装饰的数据类型为boolean、string、number类型时,可以观察到数值的变化。
  1. // for simple type
  2. @State count: number = 0;
  3. // value changing can be observed
  4. this.count = 1;
  • 当装饰的数据类型为class或者Object时,可以观察到自身的赋值的变化,和其属性赋值的变化,即Object.keys(observedObject)返回的所有属性。例子如下。
    声明ClassA和Model类。
  1. class ClassA {
  2. public value: string;
  3. constructor(value: string) {
  4. this.value = value;
  5. }
  6. }
  7. class Model {
  8. public value: string;
  9. public name: ClassA;
  10. constructor(value: string, a: ClassA) {
  11. this.value = value;
  12. this.name = a;
  13. }
  14. }

@State装饰的类型是Model

  1. // class类型
  2. @State title: Model = new Model('Hello', new ClassA('World'));

对@State装饰变量的赋值。

  1. // class类型赋值
  2. this.title = new Model('Hi', new ClassA('ArkUI'));

对@State装饰变量的属性赋值。

  1. // class属性的赋值
  2. this.title.value = 'Hi';

嵌套属性的赋值观察不到。

  1. // 嵌套的属性赋值观察不到
  2. this.title.name.value = 'ArkUI';
  • 当装饰的对象是array时,可以观察到数组本身的赋值和添加、删除、更新数组的变化。例子如下。 声明Model类。
  1. class Model {
  2. public value: number;
  3. constructor(value: number) {
  4. this.value = value;
  5. }
  6. }

@State装饰的对象为Model类型数组时。

@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));

数组项中属性的赋值观察不到。

this.title[0].value = 6;

框架行为

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

使用场景

装饰简单类型的变量
以下示例为@State装饰的简单类型,count被@State装饰成为状态变量,count的改变引起Button组件的刷新:

  • 当状态变量count改变时,查询到只有Button组件关联了它;
  • 执行Button组件的更新方法,实现按需刷新。
  1. @Entry
  2. @Component
  3. struct MyComponent {
  4. @State count: number = 0;
  5. build() {
  6. Button(`click times: ${this.count}`)
  7. .onClick(() => {
  8. this.count += 1;
  9. })
  10. }
  11. }

装饰class对象类型的变量

  • 自定义组件MyComponent定义了被@State装饰的状态变量count和title,其中title的类型为自定义类Model。如果count或title的值发生变化,则查询MyComponent中使用该状态变量的UI组件,并进行重新渲染。
  • EntryComponent中有多个MyComponent组件实例,第一个MyComponent内部状态的更改不会影响第二个MyComponent。
  1. class Model {
  2. public value: string;
  3. constructor(value: string) {
  4. this.value = value;
  5. }
  6. }
  7. @Entry
  8. @Component
  9. struct EntryComponent {
  10. build() {
  11. Column() {
  12. // 此处指定的参数都将在初始渲染时覆盖本地定义的默认值,并不是所有的参数都需要从父组件初始化
  13. MyComponent({ count: 1, increaseBy: 2 })
  14. .width(300)
  15. MyComponent({ title: new Model('Hello World 2'), count: 7 })
  16. }
  17. }
  18. }
  19. @Component
  20. struct MyComponent {
  21. @State title: Model = new Model('Hello World');
  22. @State count: number = 0;
  23. private increaseBy: number = 1;
  24. build() {
  25. Column() {
  26. Text(`${this.title.value}`)
  27. .margin(10)
  28. Button(`Click to change title`)
  29. .onClick(() => {
  30. // @State变量的更新将触发上面的Text组件内容更新
  31. this.title.value = this.title.value === 'Hello ArkUI' ? 'Hello World' : 'Hello ArkUI';
  32. })
  33. .width(300)
  34. .margin(10)
  35. Button(`Click to increase count = ${this.count}`)
  36. .onClick(() => {
  37. // @State变量的更新将触发该Button组件的内容更新
  38. this.count += this.increaseBy;
  39. })
  40. .width(300)
  41. .margin(10)
  42. }
  43. }
  44. }

在这里插入图片描述
从该示例中,我们可以了解到@State变量首次渲染的初始化流程:

1.使用默认的本地初始化:

  1. @State title: Model = new Model('Hello World');
  2. @State count: number = 0;

2.对于@State来说,命名参数机制传递的值并不是必选的,如果没有命名参数传值,则使用本地初始化的默认值:

MyComponent({ count: 1, increaseBy: 2 })


最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?但是又不知道从哪里下手,而且学习时频繁踩坑,最终浪费大量时间。所以本人整理了一些比较合适的鸿蒙(HarmonyOS NEXT)学习路径和一些资料的整理供小伙伴学习

点击领取→纯血鸿蒙Next全套最新学习资料希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取~~

一、鸿蒙(HarmonyOS NEXT)最新学习路线

​​

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)…等技术知识点。

获取以上完整版高清,请点击→纯血版全套鸿蒙HarmonyOS学习资料

二、HarmonyOS Next 最新全套视频教程

​​

三、《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

​​

四、大厂面试必问面试题

​​

五、鸿蒙南向开发技术

​​

六、鸿蒙APP开发必备

​​
完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

总结
总的来说,对于大家来说ye是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

                        

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux42835 人正在系统学习中
注:本文转载自blog.csdn.net的代码中的爱码士的文章"https://blog.csdn.net/maniu110/article/details/140214093"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top