【OpenHarmony】ArkTS 语法基础 ⑤ ( ArkTS 状态管理 | @State 装饰器定义状态数据 | 使用状态数据渲染组件 )

news/2025/1/15 22:00:15/

文章目录



在这里插入图片描述


参考文档 : <HarmonyOS第一课>ArkTS开发语言介绍


上一篇博客 【OpenHarmonyArkTS 语法基础 ④ ( ArkTS UI 渲染控制 | if else 条件渲染 | ForEach 循环渲染 ) 中介绍了 ArkTS 的 UI 渲染 , 将 UI 组件渲染到应用界面中 ;

本篇博客中开始介绍 ArkTS 的状态管理 , 为 UI 组件设置动态效果 , 根据用户的输入 / 操作 展示不同的交互效果 ;


博客源码 : https://download.csdn.net/download/han1202012/89400248





ArkTS___State__26">一、ArkTS 状态管理 - @State 装饰器




1、@State 装饰器定义状态数据


使用 @State 装饰器 装饰的 必须是 自定义组件 内部的变量 ,

被装饰的 组件内部变量 成为 " 状态数据 " ;

如果 " 状态数据 " 被修改 , 该自定义组件 会 自动刷新 UI , 重新调用 build 函数 进行 UI 渲染 ;

@State 装饰器可以实现组件内部更新 UI 的场景 ;


2、@State 装饰器定义状态数据 - 示例分析


定义状态数据 : 在下面的 @Component 装饰的 MyComponent 自定义组件内部 , 使用 @State 装饰器 装饰 isSelected: boolean 类型的状态数据 ;

@Component
export struct MyComponent {// 是否被选中@State isSelected: boolean = false;
}

3、使用 @State 装饰器定义的状态数据渲染组件 - 示例分析


使用状态数据 : 在 UI 渲染函数 build 函数中 , 设置如下 Text 组件 , 组件的文本显示 状态数据 的值 , 根据该状态数据的值 设置不同的文本颜色 ,

如果状态数据 isSelected 为 true , 则将文本设置成黄色 , 反之则设置成白色 ,

为该组件设置 onClick 点击事件 , 每次点击时 , isSelected 状态数据的值就发生改变 , 由 true 变为 false , 或 由 false 变为 true ;

      // UI 组件 的 状态管理Text('选中状态 : ' + this.isSelected).fontSize(20).fontColor(this.isSelected ? Color.Yellow : Color.White).backgroundColor(Color.Black).onClick(() => {if (this.isSelected) {this.isSelected = false;} else {this.isSelected = true;}})//onClick(




二、完整代码示例




1、完整自定义组件代码示例


使用了 @State 装饰器 定义 状态数据自定义组件 ,

import hilog from '@ohos.hilog'@Component
export struct MyComponent {// 要显示的文字内容num1: number = 80;// 循环渲染数据源numArr: number[] = [9527, 2024, 911];// 是否被选中@State isSelected: boolean = false;// 创建后 , build 之前回调aboutToAppear() {console.log("HSL MyComponent aboutToAppear")}// 自定义子组件build() {Column({ space: 20 }) { // 设置子组件间距为10// 条件渲染 使用 if else 进行渲染// 根据不同的条件 动态控制组件显示if (this.num1 >= 60) {Text('Text1 ' + this.num1).fontSize(20).fontColor(Color.White).backgroundColor(Color.Red)} else {Text('Text1 ' + this.num1).fontSize(20).fontColor(Color.White).backgroundColor(Color.Black)}// 第一个参数是数组// 第二个参数是子组件生成函数// 第三个参数是键值生成器ForEach(// 参数一 : 数组, 循环渲染 的 数据源this.numArr,// 参数二 : 子组件生成函数(item: number, index: number): void => {Text('Text ' + index + " " + item).fontSize(20).fontColor(Color.White).backgroundColor(Color.Black)}, // (item, index) => {// 参数三 : 键值生成器, 为组件生成唯一稳定键值(item: number, index: number): string => "ForEach" + index) // ForEach// UI 组件 的 状态管理Text('选中状态 : ' + this.isSelected).fontSize(20).fontColor(this.isSelected ? Color.Yellow : Color.White).backgroundColor(Color.Black).onClick(() => {if (this.isSelected) {this.isSelected = false;} else {this.isSelected = true;}})//onClick(}.width('50%') // 设置 Row 的宽度.height('50%') // 设置 Row 的高度.backgroundColor(Color.Pink).alignItems(HorizontalAlign.Center) // 水平居中.justifyContent(FlexAlign.Center) // 垂直居中}// build 之后 , 销毁前回调aboutToDisappear() {console.log("HSL MyComponent aboutToDisappear")}
}

2、展示效果


点击使用 状态数据 渲染 的组件 后的执行效果 ;

在这里插入图片描述

  • 刚进入界面 , 初始状态时 , isSlected 状态数据值为 false , 显示的文本内容是 " 选中状态 : false " , 字体颜色使用的是 白色 ;

在这里插入图片描述

  • 点击 上述 Text 组件后 , isSelected 状态数据变为 false ,
    • 状态数据改变 , 会重新调用 build 函数进行 UI 渲染 ,
    • 此时 Text 组件 显示的文本内容是 " 选中状态 : true " , 字体颜色使用的是 黄色 , 界面展示效果如下 :

在这里插入图片描述


http://www.ppmy.cn/news/1467088.html

相关文章

【面试经典150题】合并两个有序数组

目录 一.利用库函数sort二.逆双指针 一.利用库函数sort 首先我们先来看下题目的描述&#xff1a; 两个非递减的数组重新排列成非递减顺序到第一个数组中&#xff0c;并且第一个数组已经提前开好了空间。我们完全可以将nums2数组先放进nums1数组后面&#xff0c;然后整体对num…

宝塔部署vue+springboot过程(图文)

宝塔是傻瓜式操作部署&#xff0c;xshell是用linux命令部署 &#xffe5;过程&#xffe5; 整个流程具体服务器开端口在阿里云服务器打开3306端口&#xff08;有用到的端口都要打开&#xff09;宝塔&#xff1a;添加数据库获取数据库名、用户名、密码&#xff1b;点击“工具”…

clickhouse去重复数据解决方案

原因出现问题 因为我们的maxwell对接rabbitmq rabbitmq监听的是mysql的belog日志文件&#xff0c;所以mysql数据的实时操作都会同步数据到maxwell中 从而导致新增插入一条&#xff0c;修改插入一条&#xff0c;删除插入一条&#xff0c;导致同一条数据有大量的重复数据。 解决…

如何使用MATLAB写测试(2)Negative Test

如何使用MATLAB写测试&#xff08;2&#xff09;Negative Test 原文&#xff1a;如何使用MATLAB写测试&#xff08;2&#xff09;Negative Test - 知乎 (zhihu.com) 上一篇请参见 如何使用MATLAB写测试&#xff08;1&#xff09; - 知乎专栏 上一篇中&#xff0c;我们的实习…

AI 正在攻克难题——赋予计算机嗅觉

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Python02:python代码初体验

0、python代码初体验 print(hello,world)看到执行结果输出&#xff0c;则OKK! 1、输出结果取消换行 当print多个执行结果&#xff0c;又希望它们在同一行展示时&#xff1a; print(hello,world, end)print(Hao are, end ) print(you, end?) print(I am fine.) # end参数可…

TypeScript算法每日一题:一维数组的动态和(1480)

作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 题库&#xff1a;力扣 题目序号&#xff1a;1480&#xff08;简单&#xff09; 题目&#xff1a;一维数组的动态和 给你一个数组nums。数组「动态和」的计算公式为…

K8S 证书过期不能使用kubectl之后,kubeadm 重新生成证书

查询证书过期时间 kubeadm certs check-expiration重新生成证书 # 重新生成所有证书 kubeadm certs renew all # 重新生成某个组件的证书 kubeadm certs renew 组件名称 如&#xff1a;apiserver生成新的配置 # 重新生成kubeconfig配置 kubeadm init phase kubeconfig # 重…