鸿蒙开发小记:ArkTS 里几个常用状态装饰器怎么选
刚接触鸿蒙开发时,最容易混淆的地方不是语法,而是状态装饰器。@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;老项目迁移时按页面慢慢改,别一次性全换。
小结
装饰器本身不难,难的是先想清楚数据归谁管、谁会修改。把这两个问题答清楚,选型基本就不会错。
- 点赞
- 收藏
- 关注作者
评论(0)