状态管理@State

       

目录

一、简单类型的更新

二、class对象类型的变量


        被该装饰器修饰的变量,在数据变化时会触发UI的刷新,也就是ArkTS UI中触发build()函数的调用,重新根据状态构建UI。如下更新是可以观察到的:

        1、string number boolean 类型的数据可以被监听到更新。

        2、class类型 可以观察到自身的赋值的变化,和其属性赋值的变化(嵌套属性的赋值观察不到)。

一、简单类型的更新

@Entry
@Component
struct MyComponent {@State count: number = 0;build() {Button(`click times: ${this.count}`).onClick(() => {this.count += 1;})}
}

        按钮Button绑定了一个点击事件,当点击事件发生时,@State修饰的变量count会加1,框架检测到状态变更,然后查询依赖该变量的组件,执行依赖该状态变量的组件的更新方法,组件更新渲染,而和该状态变量不相关的组件或者UI描述不会发生重新渲染,从而实现页面渲染的按需更新。

二、class对象类型的变量

@Entry
@Component
struct StateDemoPage {private flag: boolean = true;//string number boolean 类型的数据可以被监听到更新@State index: number = 0// class类型 可以观察到自身的赋值的变化,和其属性赋值的变化@State title: Model = new Model('Hello', new ClassA('World'));/*** 1 数组自身的赋值可以观察到。* 2 数组项的赋值可以观察到。* 3 删除数组项可以观察到。* 4 新增数组项可以观察到。* 5 数组项中属性的赋值观察不到。(X)*/@State array: Model[] = [new Model('a', new ClassA('xx')), new Model('b', new ClassA('yy'))]build() {Row() {Column({ space: 12 }) {Text(`${this.index}`).stateTextStyle(() => {this.index++})Text(`${this.title.key}-${this.title.value.subtitle}`).stateTextStyle(() => {if (this.flag) {this.title = new Model('World', new ClassA('Hello'))} else {this.title.key = 'World Change'}this.flag = !this.flag// 嵌套的属性赋值观察不到// this.title.name.value = 'ArkUI'})ForEach(this.array, (item: Model, index) => {Row() {Text(item.key).width('40%').fontSize(24).backgroundColor(Color.Orange)Text(item.value.subtitle).width('40%').fontSize(24).fontColor(Color.Red).backgroundColor(Color.Blue)}.backgroundColor('#8067c8ff').transition({ type: TransitionType.All, translate: {x: 200, y: 40} })}, item => JSON.stringify(item))Button('ClickMe').backgroundColor('#67c8ff').fontColor(Color.White).borderRadius(12).height(44).padding({ left: 24, right: 24 }).onClick(() => {animateTo({}, () => {// this.array = [new Model('dd', new ClassA('zz')), new Model('mm', new ClassA('z1z1'))]// this.array[0] = new Model('AA', new ClassA('xx'))// this.array.unshift(new Model('AA', new ClassA('xx'))) //头部插入// this.array.shift()//头部删除// this.array.push(new Model('AA', new ClassA('xx'))) //尾部插入// this.array.pop()//尾部删除//元素中属性的赋值不能被观察到[所与可被观察到的属性一起使用的话,也可以被观察到]this.array[0].value.subtitle = 'Nested action'})})}.width('100%')}.height('100%')}
}export class ClassA {public subtitle: string;constructor(value: string) {this.subtitle = value;}
}export class Model {public key: string;public value: ClassA;constructor(key: string, value: ClassA) {this.key = key;this.value = value;}
}

        上例中演示了以下几种情况:

  • 数组自身的赋值可以观察到。
this.array = [new Model('dd', new ClassA('zz')), new Model('mm', new ClassA('z1z1'))]
  • 数组项的赋值可以观察到。
this.array[0] = new Model('AA', new ClassA('xx'))
  • 删除数组项可以观察到。
this.array.shift()//头部删除
this.array.pop()//尾部删除
  • 新增数组项可以观察到。
this.array.unshift(new Model('AA', new ClassA('xx'))) //头部插入
this.array.push(new Model('AA', new ClassA('xx'))) //尾部插入
  • 数组项中属性的赋值观察不到。(X)

        此情况需要说明下,如果单独像下面这样更新数据时,框架是不是检测到数据变化的,也就不会触发UI刷新:

this.array[0].value.subtitle = 'Nested action'

        但是但是但是当与其他可被观察到的行为一起更新数据时,也是能正确刷新的到UI上的呢(可被观察的行为能触发UI更新,UI更新时会把相关联的数据都用上,所以能更新到UI上)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java8实战 lambda表达式、函数式接口、方法引用双冒号(中)

前言 书接上文,上一篇博客讲到了lambda表达式的应用场景,本篇接着将java8实战第三章的总结。建议读者先看第一篇博客 其他函数式接口例子 上一篇有讲到Java API也有其他的函数式接口,书里也举了2个例子,一个是java.util.functi…

Rust中Result处理方式

在Rust中有一个特殊的角色Result,是最常用的返回内容,如果是从其他语言转到Rust的话会觉得很别扭,很不习惯去处理Result(至少我是这样的),所以今天整理一下在Rust中如何处理Result,也是自我整理…

java并发-ConcurrentHashMap 在Java7 和 8 的区别

文章目录 1.Java 7 版本的 ConcurrentHashMap2.Java 8 版本的 ConcurrentHashMap3.分析 Java 8 版本的 ConcurrentHashMap 的重要源码3.1.Node 节点3.2.put 方法源码分析3.3.get 方法源码分析 4.对比 Java7 和 Java8 的异同和优缺点4.1.并发度4.2.保证并发安全的原理4.3.遇到 H…

Jmeter实现CSV数据批量导入

CSV:逗号分隔值,是一种简洁且常见的数据存储格式。 1、参数化: 在Jmeter中,可以通过“用户自定义的变量”来实现参数化使操作方便,使用语法位:${参数名},如下图: 而CSV也同理&…

本地文件内容搜索神器AnyTXT Searcher如何搭建与远程访问

文章目录 前言1. AnyTXT Searcher1.1 下载安装AnyTXT Searcher 2. 下载安装注册cpolar3. AnyTXT Searcher设置和操作3.1 AnyTXT结合cpolar—公网访问搜索神器3.2 公网访问测试 4. 固定连接公网地址 前言 你是否遇到过这种情况,异地办公或者不在公司,想找…

java注意项--更新中

前言: 1.大小写规定 1.1.类名和接口名:每个单词首字母大写。如GoodStudent; 是一个单词的时候首字母大写。如Student; 1.2.变量和方法名:第一个首字母小写,后序首字母大写。如firstName; 是一…

vue的语法模板与数据绑定的说明

vue的两大模板语法: 1.插值语法 2.指定语法 插值语法:{{}} 功能:用于解析标签体的内容 写法:{{xxx}},xxx是js表达式,且可以直接读取到data中的所有属性 指定语法: 功能:用于解析标签(包括:标签属性、标…

ChatGPT助力Excel数据分析:让你的工作事半功倍!

文章目录 一、ChatGPT简介二、ChatGPT在Excel数据分析中的应用1. 数据清洗2. 数据处理3. 数据分析4. 数据可视化 三、如何使用ChatGPT进行Excel数据分析1. 安装ChatGPT插件2. 输入问题或命令3. 查看结果并调整参数4. 导出结果并分享四、总结与展望 《巧用ChatGPT高效搞定Excel数…

苹果cms论坛多播放源自动采集 /采集在线影视网站/苹果CMS影视站采集器

源码介绍: 苹果cms论坛多播放源自动采集、采集在线影视网站,作为苹果CMS影视站采集器,它能轻松获取在线影视网站资源。 苹果 cms 论坛这是一个基于Vue和Gin实现的在线观影网站。项目采用 vite vue 作为前端技术栈, 使用 ElementPlus 作为 …

el-select 全选

<template><div class"container"><el-selectv-model"choosedList"clearablemultiplecollapse-tagsplaceholder"请选择"change"select_Change"><div style"padding: 0 20px; line-height: 34px">&l…

Linux字符设备号

一. 简介 为了方便管理&#xff0c;Linux 中每个设备都有一个设备号。 为了后面字符设备驱动的学习&#xff0c;本文了解一下 设备号组成与分配。 二. Linux字符设备号的组成与分配 1. 设备号的组成 设备号由主设备号和次设备号两部分组成&#xff0c;主设备号表示某一个…

JVM快速入门

JVM 字节码 字节码文件的组成 字节码由五个部分组成&#xff1a;基础信息 常量池 字段 方法 属性 基础信息&#xff1a; 魔数、字节码文件对应的版本号、访问标识&#xff08;public final&#xff09;、该类的父类索引、该类实现哪些接口的索引 魔数&#xff1a;文件无法…

顶级加密混淆混淆工具测评:ipagurd

摘要 JavaScript代码安全需求日益增长&#xff0c;因此JavaScript混淆工具的使用变得广泛。本文将对专业、商业JavaScript混淆工具ipagurd进行全面评估&#xff0c;通过比较其功能、操作便捷性、免费试用、混淆效果等方面&#xff0c;帮助开发者选择适合自己项目需求的工具。 …

期货平仓日历(期货平仓日期汇总)

什么是期货平仓日历&#xff1f; 期货是一种高风险高收益的投资品种。而期货交易不同于股票等其他投资品种的交易&#xff0c;期货交易需要在一定时间内才能买卖。而期货平仓日历就是指期货交易中规定的所有合约的平仓日期汇总。 常见期货平仓日期和时间&#xff1f; 不同的…

关于EasyExcel 合并单元格方法该如何实现

在做一个业务的导出&#xff0c;目前遇到一个需求&#xff0c;如下图&#xff1a; import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metad…

在mt5上哪里可以添加指数品种?

在MT5交易平台上&#xff0c;您可以通过以下步骤添加指数品种&#xff08;如股票指数、商品指数等&#xff09;到您的市场观察窗口中&#xff1a; Exness手机登录平台学习指南 步骤一&#xff1a;打开市场观察窗口&#xff1a; 打开MT5交易平台。 在左侧的“市场观察”窗口中&…

高集成高能效FAN21SV04MPX 单输入集成同步降压调节器技术解析

FAN21SV04MPX 是一款高效、小型、可编程频率的 4 A 集成同步降压调节器。FAN21SV04MPX 采用经过优化的互联方式将同步MOSFET和控制器/驱动器包含在一个封装中&#xff0c;使得设计人员能够使用最少的外部元件&#xff0c;在较小面积中满足高电流要求&#xff0c;从而降低成本。…

Python列表去重且不改变元素顺序的代码

Python列表去重且不改变元素顺序的方法 Python列表去重&#xff0c;如果不考虑原来元素的顺序&#xff08;基本顺序&#xff09;的话&#xff0c;可以使用Python内置的set()函数对列表进行转换去重&#xff0c;然后转换会列表&#xff0c;这是因为set()集合本身就具备去重的功…

利用Spark构建房价分析与推荐系统:基于58同城数据的大数据实践

利用Spark构建房价分析与推荐系统&#xff1a;基于58同城数据的大数据实践 基于Spark的房价数据分析预测推荐系统引言技术栈功能概述项目实现1. 数据爬取与处理2. 大数据分析与可视化3. 房价预测模型4. 协同过滤推荐系统5. Web应用开发6. 数据管理与用户管理 总结与展望 基于Sp…

docker学习(十一、Redis集群存储数据方式)

文章目录 一、集群数据存储1.单机连接集群问题2.集群方式连接redis存储数据 二、 查看集群信息 docker搭建Redis集群相关知识&#xff1a; docker学习&#xff08;九、分布式存储亿级数据知识&#xff09; docker学习&#xff08;十、搭建redis集群&#xff0c;三主三从&#x…