【鸿蒙开发】@State装饰器:组件内状态

1. 概述

@State装饰的变量,与声明式范式中的其他被装饰变量一样,是私有的,只能从组件内部访问,在声明时必须指定其类型和本地初始化

2. 装饰器使用规则说明

@State变量装饰器

说明

装饰器参数

同步类型

不与父组件中任何类型的变量同步。

允许装饰的变量类型

Object、class、string、number、boolean、enum类型,以及这些类型的数组。嵌套类型的场景请参考观察变化。

类型必须被指定。

不支持any,不支持简单类型和复杂类型的联合类型,不允许使用undefined和null。

说明

建议不要装饰Date类型,应用可能会产生异常行为。

不支持Length、ResourceStr、ResourceColor类型,Length、ResourceStr、ResourceColor为简单类型和复杂类型的联合类型。

被装饰变量的初始值

必须本地初始化。

 不允许使用 any、undefined、null 类型

不能装饰 Date 类型

不支持Length、ResourceStr、ResourceColor类型,Length、ResourceStr、ResourceColor为简单类型和复杂类型的联合类型。

3. 观察变化

3.1 boolean、string、number

当装饰的数据类型为boolean、string、number类型时,可以观察到数值的变化。

// for simple type
@State count: number = 0;
// value changing can be observed
this.count = 1;

3.2 class、Object

当装饰的数据类型为class或者Object时,可以观察到自身的赋值的变化。

声明ClassA和Model类。

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

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

对@State装饰变量的赋值。

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

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

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

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

// 嵌套的属性赋值观察不到
this.title.name.value = 'ArkUI';

3.3 array

当装饰的对象是array时,可以观察到数组本身的赋值和添加、删除、更新数组的变化。例子如下。

声明Model类。

class Model {
  public value: number;
  constructor(value: number) {
    this.value = value;
  }
}

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

4. 框架行为

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

5. 装饰简单类型的变量

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

  • 当状态变量count改变时,查询到只有Button组件关联了它;
  • 执行Button组件的更新方法,实现按需刷新。
@Entry
@Component
struct APage {
  @State count: number = 0;

  build() {
    Column() {
      Button(`click times: ${this.count}`)
        .onClick(() => {
          this.count += 1;
        })
    }
    .width('100%')
    .height('100%')
  }
}

6. 装饰class对象类型的变量

  • 自定义组件MyComponent定义了被@State装饰的状态变量title,其中title的类型为自定义类Model。如果title的值发生变化,则查询MyComponent中使用该状态变量的UI组件,并进行重新渲染。

@Entry
@Component
struct APage {
  build() {
    Column() {
      MyComponent({ title: new Model('Hello World 2') })
    }
    .width('100%')
    .height('100%')
  }
}

class Model {
  public value: string;

  constructor(value: string) {
    this.value = value;
  }
}
 
@Component
struct MyComponent {
  @State title: Model = new Model('Hello World');

  build() {
    Column() {
      Text(`${this.title.value}`)
        .margin(10)
      Button(`Click to change title`)
        .onClick(() => {
          // @State变量的更新将触发上面的Text组件内容更新
          this.title.value = this.title.value === 'Hello ArkUI' ? 'Hello World' : 'Hello ArkUI';
        })
        .width(300)
        .margin(10)
    }
  }
}

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

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

相关文章

蚁群(ACO)算法简介

蚁群(ACO)算法简介 前言一、 ACO简介1. 起源2. 思想3. 基本概念3.1 并行3.2 禁忌表3.3 启发式信息 4. 流程 前言 生活中我们总能看到一群蚂蚁按照一条非常有规律的路线搬运食物回到巢穴,而且每只蚂蚁的路线都是近似相同且较优的,…

7-11 分段计算居民水费

题目链接&#xff1a;7-11 分段计算居民水费 一. 题目 1. 题目 2. 输入输出格式 3. 输入输出样例 4. 限制 二、代码 1. 代码实现 #include <stdio.h>static float money (unsigned int water) {if (water < 15) { // 不超过15吨时if (water) { // 不为0return wat…

教师必备工具?了解一下国产电路仿真软件的教学应用吧!

在当今信息化时代&#xff0c;科技的不断发展为教学提供了更多可能性。特别是在电子工程领域&#xff0c;教师们需要寻找更有效的方式来教授复杂的电路知识。在这个背景下&#xff0c;国产电路仿真软件的教学应用成为了备受关注的话题。本文将探讨教师使用电路仿真软件的必要性…

【MySQL学习】MySQL的慢查询日志和错误日志

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

SpringCloudAlibaba基础使用(2024最全、最新)

一、简介二、服务注册配置Nacos2.1 下载启动2.2 服务注册2.3 服务配置2.3.1 NameSpace-GroupID-DataId 三、熔断限流 Sentinel3.1 介绍3.2 下载安装3.3 如何使用3.3.1 流控规则流控模式流控效果 3.3.2 熔断规则慢调用比例异常比例异常数 3.3.3 SentinelResource3.3.4 热点规则3…

铁山靠之数学建模-基础篇

小黑子的数模基础篇 一、什么是数学建模1.1 数学模型分类1.2 备战准备什么1.3 组队学习路线1.4 赛前准备1.5 赛题选择1.5.1 赛题类型1.5.2 ABC赛题建议 1.6 学会查询1.6.1 百度搜索技巧1.6.2 查文献1.6.3 数据预处理 1.7 建模全过程 二、数模论文2.1 论文排版2.2 标题怎么写2.3…

UE4 避免布料模拟重置后抖动

问题&#xff1a;每次设置带布料模拟的布料新位置&#xff0c;就会发生突然的抖动 解决办法&#xff1a;给“布料混合权重”或“布料最大距离缩放”K帧&#xff0c;参考数值为0.2—1&#xff08;红框内的值都试过无法解决&#xff09;

Swift 异步序列 AsyncStream 新“玩法”以及内存泄漏、死循环那些事儿(上)

概览 异步序列&#xff08;Async Sequence&#xff09;是 Swift 5.5 新并发模型中的一员“悍将”&#xff0c;系统标准库中很多类都做了重构以支持异步序列。我们还可以用 AsyncStream 辅助结构非常方便的创建自己的异步序列。 这里我们就来一起聊聊 AsyncStream 结构&#xf…

领鸡蛋游戏养鸡游戏淘宝客源码广告联盟

用户中心 用户信息&#xff1a;显示用户名、头像、鸡蛋数量、足迹等基本信息。我的足迹&#xff1a;展示用户的饲料获取记录明细&#xff0c;包括来源、数量和时间。我的好友&#xff1a;展示邀请的好友列表&#xff0c;支持好友间互动&#xff0c;如串门、偷取/赠送饲料&#…

贪心算法|135.分发糖果

力扣题目链接 class Solution { public:int candy(vector<int>& ratings) {vector<int> candyVec(ratings.size(), 1);// 从前向后for (int i 1; i < ratings.size(); i) {if (ratings[i] > ratings[i - 1]) candyVec[i] candyVec[i - 1] 1;}// 从后…

【科东软件】鸿道Intewell-Lin_V2.2.0 软件版本发布

鸿道操作系统 Intewell-Lin_V2.2.0 软件版本发布 Intewell-Lin_V2.2.0 版本号&#xff1a;V2.2.0 版本或修改说明 增加功能&#xff1a; 1、增加T3板级支持 支持硬件列表

AI绘画工具的兴起与应用:热门AI绘画生成器推荐及使用指南

文章目录 一、AI绘画工具概述二、热门AI绘画生成器推荐2.1、DALL-E22.2、DeepDreamGenerator2.3、Artbreeder2.4、BigSleep2.5、NightCafe2.6、DeepAI2.7、触站AI2.8、美术加AI2.9、文心一格 三、如何使用AI绘画生成器3.1、选择AI绘画生成器3.2、描述画面内容3.3、选择绘画风格…

【Spring Cloud】服务容错中间件Sentinel入门

文章目录 什么是 SentinelSentinel 具有以下特征&#xff1a;Sentinel分为两个部分: 安装 Sentinel 控制台下载jar包&#xff0c;解压到文件夹启动控制台访问了解控制台的使用原理 微服务集成 Sentinel添加依赖增加配置测试用例编写启动程序 实现接口限流总结 欢迎来到阿Q社区 …

为什么 C/C++ 的库很喜欢缩写?

一、正如很多回答已经提到的&#xff0c;早期的有效标识符长度有限制&#xff0c;所以缩写用得比较多。也主要是在 C 里&#xff08;Unix 的传统&#xff09;。C 里的标识符用缩写的不多。如 C98&#xff08;毕竟比 C89 晚了 9 年么&#xff09;里我们就已经有了很多挺长的名字…

Java面试必问题29:MySQL篇(重点必问)

数据库的ACID特性 原子性&#xff08;Atomicity&#xff09;&#xff1a;事务中的操作要么全部成功&#xff0c;要么全部失败。事务是一个不可分割的单元&#xff0c;要么全部执行&#xff0c;要么全部回滚。如果事务中的任何操作失败&#xff0c;所有操作都将被回滚到事务开始…

​5种常用于LLM的令牌遮蔽技术介绍以及Pytorch的实现

本文将介绍大语言模型中使用的不同令牌遮蔽技术&#xff0c;并比较它们的优点&#xff0c;以及使用Pytorch实现以了解它们的底层工作原理。 令牌掩码Token Masking是一种广泛应用于语言模型分类变体和生成模型训练的策略。BERT语言模型首先使用&#xff0c;并被用于许多变体(R…

python|enumerate

enumerate可以用来列举可遍历的对象 # 假设我们有一个列表 fruits [apple, banana, cherry] # 使用enumerate()函数遍历列表 for index, fruit in enumerate(fruits): print(f"Index: {index}, Fruit: {fruit}")# 假设我们想要从1开始计数 for index, fru…

使用ADO.NET访问数据库

目录 访问数据库的步骤 &#xff11;、建立数据库 &#xff12;、设置链接参数 &#xff08;1&#xff09;web网页和数据库连接的方法一 &#xff08;2&#xff09;web网页和数据库连接的方法二 &#xff13;、建立链接对象 &#xff14;、显示数据库 &#xff15;、数…

第十五讲:C语言内存函数

目录 1、C语言内存函数 1.1、memcpy函数的使用和模拟 1.2、memmove函数的使用和模拟 1.3、memset函数的使用 1.4、memcmp函数的使用 1、C语言内存函数 注意&#xff1a;下面这些函数的使用要包含头文件&#xff1a;string.h 1.1、memcpy函数的使用和模拟 函数声明为&am…

echarts 条形图(柱状图)多个图例按钮默认高亮一个,且只能高亮一个

核心&#xff1a;给图例按钮添加点击事件 myChart.on("legendselectchanged", function (params) {let selected {功率柜: true,母线柜: false,充电桩终端: false,网络柜: false,};for (let key in selected) {if (key ! params.name) {myChart.setOption({legend:…