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

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

文章目录

  • 一、ArkTS 状态管理 - @State 装饰器
    • 1、@State 装饰器定义状态数据
    • 2、@State 装饰器定义状态数据 - 示例分析
    • 3、使用 @State 装饰器定义的状态数据渲染组件 - 示例分析
  • 二、完整代码示例
    • 1、完整自定义组件代码示例
    • 2、展示效果



在这里插入图片描述


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

@State 装饰器参考文档 : https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/arkts-state-0000001474017162-V2


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

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


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





一、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 " , 字体颜色使用的是 黄色 , 界面展示效果如下 :

在这里插入图片描述

相关文章:

  • 程序员搞副业一些会用到的工具
  • SpringBoot+Vue图书管理系统(前后端分离)
  • 配网终端通讯管理板,稳控装置通讯管理卡,铁路信号通讯管理卡
  • loading组件封装原理
  • 关于xilinx srio ip复位问题
  • 【复现】含能量路由器的交直流混合配电网潮流计算
  • Ubuntu22.04下源码编译安装pythonocc-7.8
  • 五分钟上手IoT小程序
  • Java基础 - 日期时间(Calendar)
  • Docker面试整理-什么是Docker Compose?
  • JimuReport 积木报表 v1.7.52 版本发布,免费的低代码报表
  • 2024050702-重学 Java 设计模式《实战状态模式》
  • PowerDesigner遍历导出所有表结构到Excel
  • Linux shell编程基础
  • 2024-06-08 Unity 编辑器开发之编辑器拓展9 —— EditorUtility
  • 自己简单写的 事件订阅机制
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Android系统模拟器绘制实现概述
  • Angular 4.x 动态创建组件
  • Angular数据绑定机制
  • centos安装java运行环境jdk+tomcat
  • JavaScript 奇技淫巧
  • js中的正则表达式入门
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Vue.js 移动端适配之 vw 解决方案
  • 动态规划入门(以爬楼梯为例)
  • 浮动相关
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 扑朔迷离的属性和特性【彻底弄清】
  • 嵌入式文件系统
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 译有关态射的一切
  • 再次简单明了总结flex布局,一看就懂...
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 7行Python代码的人脸识别
  • Nginx实现动静分离
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #define、const、typedef的差别
  • #微信小程序(布局、渲染层基础知识)
  • (007)XHTML文档之标题——h1~h6
  • (1)Android开发优化---------UI优化
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (已解决)什么是vue导航守卫
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .chm格式文件如何阅读
  • .dwp和.webpart的区别
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net core 控制台应用程序读取配置文件app.config