杨利杰YJlio博客头图

@State状态管理入门

前言:从当前组件的一份状态开始

大家好,我是杨利杰 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 是否读取它。

事件修改,UI读取

按钮可见不证明回调进入;字段变化也不能证明 Text 读取了它。实际运行时把事件日志、数值前后变化和画面分别记录,才能解释结果。

不要在 build() 中为了驱动画面而反复修改状态。UI 描述负责表达结构,交互更新放在明确事件路径中,避免难以追踪的重复更新。

修改与显示要指向同一份状态,静态文案不会因为其他字段变化就变成动态值。

若封装函数或子组件参与读取,继续追踪真实数据来源,不靠变量名相似判断关联。

五、普通字段与状态观察规则不同

普通字段可以保存数据,但不自动保证 UI 观察它的变化。

普通字段与观察规则

@State 根据对应规则观察受支持的变化,并更新依赖该状态的关联 UI。不是每个赋值都意味着整页重绘,也不是所有对象深层变化都自然进入观察范围。

华为状态管理术语说明了状态观察的层级与属性级更新概念。这里不把某个版本的细节推广到所有状态方案。

实际例子没有变化时,先查事件、字段声明和读取路径,再决定是否需要修改状态结构;不要只靠替换装饰器碰运气。

六、本地状态与持久化分开

我把“页面暂时记住”与“重新启动仍有数据”分开理解。

本地状态不是持久化

原稿没有 Preferences、文件、数据库或其他持久化操作。@State 本身不能证明数据已经保存到磁盘。

组件真正销毁后重新创建,会重新走对应初始化流程;应用页面缓存、路由保留与组件复用等条件可能影响实际现象。因此,不能只凭一次返回页面后的数量就断定已持久化。

重新出现的页面不一定是新实例,保持旧值也不一定是磁盘保存。

记录实验时说明是重新创建组件、返回保留页面,还是退出再启动应用,避免把不同操作写成同一个测试。

七、数字例子不能覆盖复杂对象

本篇 count 是 number。替换成对象或数组以后,需要重新核对观察规则。

简单值与复杂对象分开

更新情况后续阅读方向
简单值赋值当前装饰器的简单类型观察
对象属性修改能观察到的属性层级
嵌套字段修改对应嵌套对象方案
数组变化数组及元素更新规则

华为内部类状态管理说明讨论了嵌套类与观察能力;V1/V2内部类迁移说明说明了不同方案的差异。

本文不添加复杂对象的伪运行结果,也不把浅拷贝写成所有刷新问题的通用解法。先定义数据与观察边界,再选对应方法。

八、按操作分别记录实际效果

我会先在当前工程验证最小例子,保持操作和观察项明确。

按操作记录实际效果

操作观察项实际结果
启动初始组件count初值与文案待填写
点击增加回调进入与count变化待填写
查看 Text显示是否对应当前count待填写
确认重新创建组件初始化行为与实例条件待填写

先保存、构建、安装并启动目标工程。构建失败时保存完整诊断;不能把 IDE 预览当作设备验证。

一次只改一项,保留入口路径、SDK、操作步骤和实际画面。未实测的条目继续标为待填写。

学习总结

这篇我从本地 count 的声明开始,沿按钮修改与 Text 读取理解状态,再区分普通字段、复杂对象和持久化。例子越小,读写关系越容易核对。

下一篇学习父子组件参数与状态传递。发布前补齐实际环境、编译与设备运行记录。

参考资料

  1. 华为开发者文档:状态管理术语
  2. 华为开发者文档:内部类与嵌套对象状态管理
  3. 华为开发者文档:V1/V2 内部类迁移说明

声明:本文为状态学习示例,配图为结构与文案示意;语法、观察范围、初始化和运行结果以当前模板、SDK、实际设备及官方文档为准。

分隔线

返回顶部

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐