【鸿蒙心迹】HarmonyOS笔记16:State状态管理
🔥 个人主页: 杨利杰YJlio
❄️ 个人专栏: 《Windows 疑难杂症与工单复盘案例库》 《Sysinternals实战教程》
《WINDOWS教程》 《Windows PowerShell 实战》 《IOS插件分析测试》
🌟 让复杂的事情更简单,让重复的工作自动化


文章目录
前言:从当前组件的一份状态开始
大家好,我是杨利杰 YJlio。
第16篇我正式阅读 @State 的基础用法。沿用上一篇计数例子,把状态声明、按钮修改与 Text 读取连起来,再说明本地状态的边界。
本文采用原稿的状态管理 V1 学习片段,没有执行本机编译或设备运行。配图为结构与文案示意,不是运行截图。
@State 管理组件状态,不会自动把数据保存到磁盘,也不会自动建立跨组件同步。
| 环境项 | 实际记录 |
|---|---|
| DevEco Studio、SDK/API | 待填写 |
| 模板组件与入口 | 待填写 |
| 设备、系统与窗口 | 待填写 |
| 编译与运行结果 | 待填写 |
一、先确认状态属于哪个组件
我先在组件声明里找到字段,再查看它的读写位置。

本例只有当前组件里的 count、按钮事件和 Text。它们处在同一组件范围,不涉及父子参数、共享存储或数据库。
状态字段属于组件实例。多个实例不能仅因为字段同名,就认为共享同一份值;若需要同步,需要单独设计与使用对应机制。
当前例子重点是组件内部交互,下一篇才讨论父子传递。先把边界说清楚,后续更容易区分本地值与外部来源。
二、把状态声明拆成四部分
我会分别读装饰器、字段名、类型与初始值。

| 部分 | 本例内容 | 阅读重点 |
|---|---|---|
| 装饰器 | @State | 参与对应状态观察机制 |
| 字段名 | count | 按钮与文字使用同一字段 |
| 类型 | number | 本例只练习数字 |
| 初始值 | 0 | 创建时的本地初始配置 |
字段要放在组件声明内部,不能随意移到 build() 局部变量里。实际初始化限制、支持类型和模板声明需按当前 SDK 核对。
本文使用 V1 的 @State,不把 @Local 等 V2 装饰器写成可以无条件互换的名字。迁移时应连同组件声明和观察规则一起调整。
三、保留原稿的最小计数片段
我先用一个 Text 和一个 Button 阅读最短路径。

以下片段需要放进当前模板的组件中,不是完整入口文件。
@State count: number = 0;
build() {
Column() {
Text(`当前数量:${this.count}`)
Button('增加').onClick(() => { this.count += 1 })
}
}
初始文案是“当前数量:0”,按钮文案是“增加”。图中只表达两段文案与纵向关系,没有指定真实设备位置。
代码意图是回调每次执行让 count 加1,然后关联文字按状态规则更新。没有实际点击记录时,这仍是待验证的行为,而不是成功运行报告。
四、事件修改状态,UI读取状态
我先确认事件写入的是 this.count,再看 Text 是否读取它。

按钮可见不证明回调进入;字段变化也不能证明 Text 读取了它。实际运行时把事件日志、数值前后变化和画面分别记录,才能解释结果。
不要在 build() 中为了驱动画面而反复修改状态。UI 描述负责表达结构,交互更新放在明确事件路径中,避免难以追踪的重复更新。
修改与显示要指向同一份状态,静态文案不会因为其他字段变化就变成动态值。
若封装函数或子组件参与读取,继续追踪真实数据来源,不靠变量名相似判断关联。
五、普通字段与状态观察规则不同
普通字段可以保存数据,但不自动保证 UI 观察它的变化。

@State 根据对应规则观察受支持的变化,并更新依赖该状态的关联 UI。不是每个赋值都意味着整页重绘,也不是所有对象深层变化都自然进入观察范围。
华为状态管理术语说明了状态观察的层级与属性级更新概念。这里不把某个版本的细节推广到所有状态方案。
实际例子没有变化时,先查事件、字段声明和读取路径,再决定是否需要修改状态结构;不要只靠替换装饰器碰运气。
六、本地状态与持久化分开
我把“页面暂时记住”与“重新启动仍有数据”分开理解。

原稿没有 Preferences、文件、数据库或其他持久化操作。@State 本身不能证明数据已经保存到磁盘。
组件真正销毁后重新创建,会重新走对应初始化流程;应用页面缓存、路由保留与组件复用等条件可能影响实际现象。因此,不能只凭一次返回页面后的数量就断定已持久化。
重新出现的页面不一定是新实例,保持旧值也不一定是磁盘保存。
记录实验时说明是重新创建组件、返回保留页面,还是退出再启动应用,避免把不同操作写成同一个测试。
七、数字例子不能覆盖复杂对象
本篇 count 是 number。替换成对象或数组以后,需要重新核对观察规则。

| 更新情况 | 后续阅读方向 |
|---|---|
| 简单值赋值 | 当前装饰器的简单类型观察 |
| 对象属性修改 | 能观察到的属性层级 |
| 嵌套字段修改 | 对应嵌套对象方案 |
| 数组变化 | 数组及元素更新规则 |
华为内部类状态管理说明讨论了嵌套类与观察能力;V1/V2内部类迁移说明说明了不同方案的差异。
本文不添加复杂对象的伪运行结果,也不把浅拷贝写成所有刷新问题的通用解法。先定义数据与观察边界,再选对应方法。
八、按操作分别记录实际效果
我会先在当前工程验证最小例子,保持操作和观察项明确。

| 操作 | 观察项 | 实际结果 |
|---|---|---|
| 启动初始组件 | count初值与文案 | 待填写 |
| 点击增加 | 回调进入与count变化 | 待填写 |
| 查看 Text | 显示是否对应当前count | 待填写 |
| 确认重新创建组件 | 初始化行为与实例条件 | 待填写 |
先保存、构建、安装并启动目标工程。构建失败时保存完整诊断;不能把 IDE 预览当作设备验证。
一次只改一项,保留入口路径、SDK、操作步骤和实际画面。未实测的条目继续标为待填写。
学习总结
这篇我从本地 count 的声明开始,沿按钮修改与 Text 读取理解状态,再区分普通字段、复杂对象和持久化。例子越小,读写关系越容易核对。
下一篇学习父子组件参数与状态传递。发布前补齐实际环境、编译与设备运行记录。
参考资料
声明:本文为状态学习示例,配图为结构与文案示意;语法、观察范围、初始化和运行结果以当前模板、SDK、实际设备及官方文档为准。

更多推荐



所有评论(0)