在鸿蒙Next的ArkUI框架中,MVVM(Model-View-ViewModel)模式是一种重要的架构模式,用于管理应用程序中的数据和UI之间的交互。MVVM模式通过将数据和视图分离,使得应用程序的开发更加高效、可维护和可测试。
ViewModel结构设计应始终为了适配自定义组件的构建和更新,将Model和ViewModel分开的原因在于,目前很多关于UI构造和更新的问题,都是由于ViewModel的设计没有很好地支持自定义组件的渲染,或者试图让自定义组件强行适配Model层,而中间没有用ViewModel来进行分离。例如,直接将SQL数据库中的数据读入内存这种数据模型不能很好地直接适配自定义组件的渲染,所以在应用程序开发中需要适配ViewModel层。
Parent
组件中使用@State
装饰testNum
变量,并将其传递给LinkChild
和Sibling
子组件。在LinkChild
组件中,@Link
装饰的testNum
与父组件的@State testNum
建立双向同步,LinkChild
中的更改会同步到父组件Parent
,再从Parent
同步到Sibling
,同时也会同步给LinkChild
的子组件LinkLinkChild
和PropLinkChild
。而PropLinkChild
中的@Prop
和其父组件建立单向同步关系。Parent
组件中使用@Provide
装饰testNum
变量,在LinkChild
、Sibling
、LinkLinkChild
等后代组件中使用@Consume
创建双向同步,通过绑定相同的key连接,而不是通过组件构造函数参数传递,将更改从父组件传递到孙子组件更加方便。LocalStorage
实例并通过@Entry(storage)
注入根节点,在Parent
组件中初始化@LocalStorageLink("testNum")
变量,会在LocalStorage
实例中创建testNum
属性并设置初始值。其子组件使用@LocalStorageLink
或@LocalStorageProp
绑定同一个属性名key来传递数据,@LocalStorageLink
和LocalStorage
中对应属性的同步行为与@State
和@Link
一致,为双向数据同步。LocalStorage
类似,在组件中使用@StorageLink
和@StorageProp
为多个页面之间共享数据,如在Parent
、LinkChild
、Sibling
等组件中使用@StorageLink("testNum")
或@StorageProp("testNum")
来共享和操作AppStorage
中的testNum
属性。大多数情况下,ViewModel数据项是复杂类型,如对象数组、嵌套对象或其组合。对于嵌套场景,使用@Observed搭配@Prop或者@ObjectLink来观察变化。推荐设计单独的自定义组件来渲染每一个数组或对象,对于类和数组,@State、@Prop、@Link、@ObjectLink装饰的变量只能观察到第一层的变化,若要观察嵌套类内部对象的变化,可使用@ObjectLink或@Prop,优先考虑@ObjectLink,其通过嵌套对象内部属性的引用初始化自身,性能更好,@Prop会对嵌套内部对象进行深度拷贝来初始化,实现单向同步,但性能较慢。
ViewB
渲染@State arrA
(Array<ClassA>
),@State
可观察新数组分配、数组项插入、删除和替换。子组件ViewA
渲染每个ClassA
对象,使用@ObjectLink a: ClassA
可观察嵌套在Array
内的ClassA
对象的变化(前提是ClassA
用@Observed
装饰)。不使用@Observed
时,如ViewB
中this.arrA[Math.floor(this.arrA.length/2)].c = 10
的操作不会被观察到,相应ViewA
组件也不会更新。ViewA
中将@ObjectLink
替换为@Prop
时,@Prop
会对嵌套对象进行深度拷贝初始化,性能慢,且在一个ViewA
中的属性赋值this.a.c += 1
不会引发使用同一个ClassA
初始化的其他ViewA
的渲染更新,因为它们是不同的拷贝。而@ObjectLink
通过引用共享对象,一个ViewA
中属性改变会触发所有引用该对象的ViewA
更新(前提是ClassA
用@Observed
装饰)。通过ViewModel层的隔离,将UI与数据模型分离,使得UI的设计和实现更加简单,开发者可以专注于UI的展示逻辑,而不必关心数据的获取和存储细节。
MVVM模式能够更高效地更新UI,当数据发生变化时,只有相关的UI部分会被更新,而不是整个UI重新渲染,从而提高了应用程序的响应速度和性能。
数据和视图的分离使得代码结构更加清晰,易于维护和测试。可以单独对ViewModel层进行单元测试,验证数据的正确性和处理逻辑,同时也方便对UI层进行单独的测试和优化。
总之,鸿蒙Next的MVVM思想为应用程序开发提供了一种有效的架构模式,有助于提高开发效率、提升应用性能和改善代码质量。开发者在实际应用中应合理利用MVVM模式的特性,根据具体需求选择合适的数据源和处理嵌套数据结构的方式,以构建出高质量的应用程序。