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

发布时间:2026/6/19 22:42:04
鸿蒙 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。