新闻详情

新闻详情

首页 / 资讯中心 / 详情

鸿蒙 ArkUI @State 状态管理详解|四大实战案例看懂响应式更新

发布时间:2026/9/19 13:54:53来源:尧图网络
鸿蒙 ArkUI @State 状态管理详解|四大实战案例看懂响应式更新
前言在鸿蒙 ArkUI 声明式开发中页面不会主动感知普通变量的变化。如果想实现修改数据后 UI 自动刷新就必须使用State装饰器。本文结合课堂 4 组实训案例从布尔开关切换、数字计数器、输入框双向绑定、登录表单校验四个场景完整讲解State的作用、语法、使用规则与实战逻辑。一、State 核心基础概念1. 作用State用来装饰组件内部私有状态变量建立「数据 - UI」双向响应绑定变量发生修改时自动触发当前组件重新渲染UI 交互按钮点击、输入框输入可以同步修改变量仅作用于当前自定义组件属于组件内局部状态。2. 基础语法State 变量名: 类型 初始值示例State isShow: boolean true State num: number 0 State inputText: string 3. 触发更新的规则只有直接赋值修改才会触发页面刷新布尔取反this.isShow !this.isShow数字增减this.num/this.num--字符串赋值this.inputText value二、案例 1布尔状态 —— 开关文字切换点击切换显示文本需求效果页面默认显示红色文字「状态已开启」点击按钮后文字、文字颜色同步切换为「状态已关闭」黄色再次点击复原。完整代码Entry Component struct StateDemo{ State isShow:booleantrue private num:number1 build() { Column({space:60}){ Text(this.isShow?状态已开启:状态已关闭) .fontSize(36) .fontWeight(FontWeight.Bold) .fontColor(this.isShow?Color.Red:Color.Yellow) Button(点击切换状态) .width(100%) .height(50) .fontSize(24) .backgroundColor(0x007dff) .onClick((){ this.isShow!this.isShow }) } .width(100%) .height(100%) .padding(30) } }效果核心知识点State isShow保存布尔状态三元运算符条件 ? 真值 : 假值实现 UI 动态渲染按钮onClick对状态变量重新赋值页面自动同步变化普通private num修改不会刷新页面只有State修饰变量才具备响应式能力。三、案例 2数字状态 —— 数值计数器限定 0~10 范围需求效果页面展示当前数字两个按钮分别实现递增、递减数字最小为 0、最大为 10超出边界不再变化。完整代码Entry Component struct StateDemo2{ State num:number0 build() { Column({space:30 }){ Text(当前的数是${this.num}) .fontSize(35) .fontWeight(FontWeight.Bolder) Row({space:30}){ Button(-递减) .width(47%) .height(50) .fontSize(26) .onClick((){ if (this.num0) { this.num-- } }) Button(递加) .width(47%) .height(50) .fontSize(26) .onClick((){ if (this.num10) { this.num } }) } .width(100%) Text(数值范围0-10) .fontSize(16) .fontColor(Color.Gray) } } }效果核心知识点数字变量被State修饰num/num--赋值后页面立刻更新通过if判断限制数值区间防止越界模板字符串${this.num}动态拼接数字文本Row 布局均分两个按钮width(47%)留出间隔避免挤压。四、案例 3字符串状态 ——TextInput 输入双向绑定需求效果输入框输入任意文字上方 Text 实时同步展示输入内容实现输入与显示双向联动。完整代码Entry Component struct StateDemo3{ State inputText:string build() { Column({space:30}){ Text(你输入的内容是\n${this.inputText}) .fontSize(25) .width(100%) .textAlign(TextAlign.Center) .fontColor(Color.Blue) TextInput({text:this.inputText,placeholder:请输入任意内容}) .width(100%) .height(50) .borderRadius(10) .onChange((value:string){ this.inputTextvalue }) } .width(100%) .height(100%) .padding(20) } }效果核心知识点TextInput通过text绑定State字符串变量实现数据同步onChange监听输入内容变化实时赋值给状态变量上方 Text 直接读取状态变量做到输入实时预览placeholder设置输入框空白提示文字。五、案例 4综合实战 —— 登录表单多状态联合校验需求说明同时使用两个State字符串变量存储账号、密码实现两个输入框双向绑定账号、密码密码框隐藏明文登录按钮点击校验账号密码匹配弹出成功弹窗不匹配弹出失败弹窗清除按钮一键清空两个输入框内容UI 同步清空。完整代码Entry Component struct EventDemo{ State username:string State password:string build() { Column({space:30}) { Text(用户登录) .fontSize(32) .fontWeight(FontWeight.Bolder) .margin({ top: 20, bottom: 30 }) TextInput({ text: this.username, placeholder: 请输入账号 }) .width(320) .height(52) .borderRadius(12) .fontSize(16) .onChange((value: string) { this.username value }) TextInput({ text: this.password, placeholder: 请输入密码 }) .type(InputType.Password) .width(320) .height(52) .borderRadius(12) .fontSize(16) .onChange((value: string) { this.password value }) Row({space:30}) { Button(立即登录) .width(40%) .height(52) .backgroundColor(0x007dff) .fontSize(18) .borderRadius(12) .margin({ bottom: 80 }) .onClick(() { if (this.username root this.password root) { AlertDialog.show({ title: 登录成功, message: 欢迎你${this.username} }) } else { AlertDialog.show({ title: 登录失败, message: 用户名或者密码错误 }) } }) Button(清除信息) .width(40%) .height(52) .backgroundColor(0x007dff) .fontSize(18) .borderRadius(12) .margin({ bottom: 80 }) .onClick((){ this.username this.password }) } } .width(100%) .height(100%) } }效果核心知识点支持同时定义多个State变量多表单字段独立管理InputType.Password实现密码框隐藏文字多状态联合判断同时校验账号、密码两个状态一键清空直接给两个State字符串赋值空字符串输入框实时清空AlertDialog弹窗展示状态校验结果。六、State 使用总结与注意事项1. 适用场景按钮点击切换 UI开关、弹窗、文字切换计数器、打分、数值调整输入框、单选多选、登录表单等多字段表单交互组件内部临时存储、页面局部动态数据2. 关键使用规则仅能修饰组件内私有变量不能修饰全局变量必须赋初始值支持boolean/number/string/ 数组 / 对象只有直接赋值才会触发 UI 刷新只读访问不会更新页面普通private变量修改不会刷新界面无响应式能力作用域仅限当前struct组件跨组件传值需要Prop/Link。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

HTML零基础入门:从标签到完整网页的手把手教程 2026/9/19 13:54:34

HTML零基础入门:从标签到完整网页的手把手教程

这门技术,当年我是一晚上学会的,玩了一个月之后才反应过来:HTML其实是所有“看起来是网页”的东西的地基,学它不亏。别管你现在是想做个人网站、想转行前端、想折腾自动化脚本、甚至只是想给自己的产品写个带样式的小页面&#xf…

阅读更多 →
深度拆解Howland电流源:从桥式平衡到精密恒流设计实战 2026/9/19 13:54:34

深度拆解Howland电流源:从桥式平衡到精密恒流设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI辅助开发Yandex搜索入口页:HTML+CSS纯静态实现指南 2026/9/19 13:54:34

AI辅助开发Yandex搜索入口页:HTML+CSS纯静态实现指南

1. 从一个搜索入口页说起:为什么值得动手做搜索引擎入口页面这个东西,看起来简单到不值一提——不就是个输入框加个按钮吗?但真正动手做过的人都知道,一个干净、快速、能用的搜索入口页,背后涉及的细节远比表面复杂。我…

阅读更多 →
Linux Shell脚本实战:从语法、权限到生产环境避坑指南 2026/9/19 13:54:34

Linux Shell脚本实战:从语法、权限到生产环境避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Cocos Creator 打包 Windows exe 与 NSIS 安装包全流程实战 2026/9/19 13:54:34

Cocos Creator 打包 Windows exe 与 NSIS 安装包全流程实战

1. 从 Cocos Creator 到 Windows 桌面程序:整体思路拆解把 Cocos Creator 做的游戏或互动应用打包成一个能在 Windows 上双击就跑的 exe,再进一步做成带安装向导的安装包,这件事听起来像是“发布流程里顺手点两下”的小事,但真做过…

阅读更多 →
Apollo Quick Start 快速上手指南:五分钟在本地启动 Apollo 配置中心(all-in-one 单机部署) 2026/9/19 13:51:34

Apollo Quick Start 快速上手指南:五分钟在本地启动 Apollo 配置中心(all-in-one 单机部署)

Apollo Quick Start 快速上手指南:五分钟在本地启动 Apollo 配置中心(all-in-one 单机部署) 【免费下载链接】apollo Apollo is a reliable configuration management system suitable for microservice configuration management scenarios.…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞