鸿蒙开发小记:ArkTS 里几个常用状态装饰器怎么选

举报
yd_225040342 发表于 2026/11/05 01:37:45 2026/11/05
【摘要】 刚接触鸿蒙开发时,最容易混淆的地方不是语法,而是状态装饰器。@State、@Prop、@Link、@Observed 看起来都差不多,用错之后页面不刷新,或者刷新得莫名其妙。这篇笔记不展开源码,只把这几个装饰器的使用场景说清楚,方便选型。 @State:组件自己的状态@State 修饰的变量属于当前组件。值变了,用到这个变量的界面就会重新渲染。典型场景是开关、输入框内容、列表数据。它不需要和...

刚接触鸿蒙开发时,最容易混淆的地方不是语法,而是状态装饰器。@State、@Prop、@Link、@Observed 看起来都差不多,用错之后页面不刷新,或者刷新得莫名其妙。

这篇笔记不展开源码,只把这几个装饰器的使用场景说清楚,方便选型。

@State:组件自己的状态

@State 修饰的变量属于当前组件。值变了,用到这个变量的界面就会重新渲染。

典型场景是开关、输入框内容、列表数据。它不需要和父组件共享,改了就生效。

需要注意的是,@State 只在当前组件内有效。子组件想读它,得通过参数传下去。

@Prop:父传子,单向

@Prop 用来接收父组件传下来的值。父组件改了,子组件会跟着更新;子组件内部改了,不会影响父组件。

适合展示型组件,比如卡片、列表项。父组件给它什么,它就显示什么,不需要回写。

如果子组件修改 @Prop 的值,只会在子组件内部生效,父组件感知不到。这一点要提前想清楚。

@Link:父子双向同步

@Link 也是父子之间传值,但它是双向的。子组件修改后,父组件的数据也会变。

适合表单、筛选条件这类需要子组件回传结果的场景。使用时,父组件要用 @State 提供数据源,子组件用 @Link 接收。

@Link 不能单独初始化,必须由父组件传入,否则编译会报错。

@Observed 和 @ObjectLink:处理对象嵌套

当状态是一个对象,而且对象内部还有嵌套对象时,只靠 @State 有时观察不到深层变化。

这时可以用 @Observed 修饰类,再用 @ObjectLink 在组件里接收这个对象。对象内部属性变化时,相关组件会刷新。

如果只是简单对象,@State 就够了,不必上来就用 @Observed。

怎么选

一句话总结:

组件内部自己用,选 @State。

父组件传给子组件展示,选 @Prop。

父子需要双向同步,选 @Link。

对象层级较深、需要观察内部变化,选 @Observed 加 @ObjectLink。

还有一点,V1 和 V2 的状态管理不要混着用。新项目可以直接用 V2 的 @ComponentV2、@Local、@Param;老项目迁移时按页面慢慢改,别一次性全换。

小结

装饰器本身不难,难的是先想清楚数据归谁管、谁会修改。把这两个问题答清楚,选型基本就不会错。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。