更多内容请访问:鸿蒙技术社区,与华为官方共建https://ost.51cto.com前言本文为主要是HarmonyOS开发文档ETS开发中UI状态管理部分的解读和简单实践,方便快捷的切入开发工作,构建应用。对应文档链接:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ts-ui-state-mgmt-concepts-0000001169868220。鸿蒙状态管理的介绍首先参考开发文档中的图片。从图片中基本可以看出整个应用中的数据流向,非常全面。华为鸿蒙开发文档为应用中的状态管理提供了丰富全面的接口(仅供通俗理解,具体定义见文档):@State:用于定义应用管理的状态,更像是React16.8之后的useState,方便的代码按照业务划分逻辑。state定义只支持class、number、boolean、string及其数组,不支持object和any。@Props:单项数据流,父组件传递子组件,直接使用this.property名称向下传递数据,子组件使用这个装饰器接收。建议对仅呈现的数据使用此定义。@Link:双向数据流,解决了vue中**emit**函数的功能。父组件使用emit??函数。父组件使用向下传输数据的功能,子组件使用这个装饰器接收。推荐在子组件中修改父组件状态的情况下使用(也就是类似于vue中需要使用$emit)。@Consume和**@Provide**:其中provide是生产者,consume是消费者。写过React的开发者应该对此不陌生。类似于react中的context上下文,这对装饰器主要实现了上层组件跨多个层给下层组件传值,实现双向数据绑定。@Observed和**@ObjectLink**:其中@Observed用于修改类,@ObjectLink用于修改子组件中被@Observed修改过的类对应的状态(具体用法见下文).这对装饰器主要解决的问题是,如果定义了一个包含多个对象(类)的数组,对象的属性发生变化,应用程序可以检测到并更新视图。@Watch:当应用程序可以监视的状态被修改时执行附加操作。AppStorage:应用中的单例对象,在应用启动时由UI框架创建,在应用退出时销毁,为应用范围内的可变状态属性提供中央存储,简单来说类似于vuex/redux。以上状态管理装饰器多用于同一个页面,按照业务/页面逻辑划分组件,实现状态管理,父子组件间传值,组件间传值。而AppStorage用于多页面(页面文件夹下有多个@Enter定义的页面)应用中跨页面共享数据。建议在带有@Enter的组件中使用AppStorage。其中的数据是从组件树的顶部注入的。对于子组件来说,只是父组件传过来的一个状态,保证子组件功能单一,输入输出稳定。外部数据解耦确保可重用性。梦想开始的地方(Typescript代替anyscript)本文主要是复杂数据类型类的使用解读,number/boolean/string的解读暂且不说,请自行尝试。Everythingstartswithclass:@State定义明确表示只允许class、number、boolean、string及其数组,不允许object和any,所以定义复杂数据类型需要class,如下图:定义接口:使用接口来定义复杂的数据(从这里的例子可以看出,可以使用**newMonth()或直接使用{}**)。这里引用官方文档https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ts-rending-control-syntax-foreach-0000001149978669中的例子。根据本文档中的例子可以看出,使用class定义复杂数据类型,在任何地方都可以观察到Month8的属性,也可以观察到日历中的数组方法改变数组,触发重新-渲染。不建议使用**any[]**来定义复杂的数据,这样定义的数据不会被应用到observe,数组会改变,view不会更新!类定义的数据可以使用@Props和@Link向下传递数据,如下图,修改第二个组件中的日历有效。将类定义的数据传递给子组件。子组件的双向绑定改变状态!跨组件传值(@Consume和@Provide)类似于react中的context上下文实现跨组件传值。上层组件的状态可以直接传递给最底层的组件,非常好用。我们已经有了@Props和@Link来解决简单的父子组件传值。该文件还提供了一种跨组件价值转移的方法。@Provide可以直接替换@State来定义状态,而@consume可以用在需要接收传递下来的状态的子组件中。定义状态:使用和渲染,并尝试改变,(其实传递给下层还是下层使用和效果没有区别)。当然传递给第三层也可以看到效果:渲染结果:修改子组件中的数组。在子组件中修改对象中的属性。在子组件中修改数组中对象的属性(此方法失败,状态改变,但不渲染,有问题),正确方法如下所示。神奇的@Observed和@ObjectLink@Observed用来装饰类,可以帮助监控多层数据中的数据变化。官方文档给出了具体的使用方法,非常灵活。这对装饰器主要解决的就是上面提到的遗留问题,如何修改数组中对象的属性,并且能够自动触发重新渲染。使用@Observed:使用@ObjectLink,这里主要是验证provider/link传递给下层的数据是否可以修改。看效果:从上面的案例可以看出,使用@Observed和@ObjectLink可以实现比较复杂数据的最内层数据的修改,使用起来也比较灵活。小结本文主要针对使用class定义复杂数据,以及跨组件传值和修改数据,根据官方文档进行简单分析。状态管理还包括对AppStorage、持久化数据、环境变量的验证,下一篇会做。详解,希望本文能在一定程度上帮助初学者ets开发者快速掌握其开发方式。
