HarmonyOS-MVVM最佳实战

3,240 阅读3分钟

bg_s2.jpg

前言

  • 熟悉Android开发或前端的同学都大致了解MVVM模式,由最初的架构 MVC->MVP->MVVM->MVI 推演而来,经过架构迭代之后,代码解耦,可读性强,数据流驱动等等优势成为了主流的开发架构。那我们来看看在HarmonyOS 中的MVVM的架构又是怎样的呢?

简单回顾MVC、MVP

  • MVC架构中,Model数据模型,处理一下基本的数据逻辑;Controller是业务的主要承载者,几乎所有的业务逻辑都在Controller中进行编写,而Controller一般都在View层上写,密不可分。

MVC.png

  • 一句话点评:对于庞大的业务而言,一个View页面能达上千行代码,太臃肿

  • MVP中,View层接收到事件后调用到业务层处理,业务层调用数据层处理数据,数据层处理数据后回调给业务层,业务层再回调给视图层更新页面。(数据层已不再持有视图层,他们之间通过业务层(Presenter)交互,具体使用接口实现,使数据层和视图层解耦.

MVP.png

  • 一句话点评:当业务复杂的时候,凌乱的Presenter,到处飞,一个View有十几种状态,但好在,它解耦啊,文件层级清晰。

MVVM

  • MVVM(Model-View-ViewModel)架构是用于构建用户界面的架构模式,它将UI和业务逻辑分离。
Android的MVVM
  • 简单看看Android的MVVM ,Android的MVVM架构得益于Jetpack库推出的组件如:DataBinding、Lifecycle、livedata、ViewModel.跟View自动解绑,放心、直观的生命周期控制,数据回调处理方便,各种控制状态都能很好的处理。

android_mvvm.png

HarmonyOS MVVM
  • Model层:存储数据和相关逻辑的模型。它表示组件或其他相关业务逻辑之间传输的数据。Model是对原始数据的进一步处理。

  • View层:在ArkUI中通常是@Component装饰组件渲染的UI。

  • ViewModel层:在ArkUI中,ViewModel是存储在自定义组件的状态变量、LocalStorage和AppStorage中的数据。

  • 自定义组件通过执行其build()方法或者@Builder装饰的方法来渲染UI,即ViewModel可以渲染View。 View可以通过相应event handler来改变ViewModel,即事件驱动ViewModel的改变,另外ViewModel提供了@Watch回调方法用于监听状态数据的改变。 在ViewModel被改变时,需要同步回Model层,这样才能保证ViewModel和Model的一致性,即应用自身数据的一致性。 ViewModel结构设计应始终为了适配自定义组件的构建和更新,这也是将Model和ViewModel分开的原因。 目前很多关于UI构造和更新的问题,都是由于ViewModel的设计并没有很好的支持自定义组件的渲染,或者试图去让自定义组件强行适配Model层,而中间没有用ViewModel来进行分离。 例如,一个应用程序直接将SQL数据库中的数据读入内存,这种数据模型不能很好的直接适配自定义组件的渲染,所以在应用程序开发中需要适配ViewModel层。

HarmonyOS_MVVM.png

理解&实战

  • 文字我都懂,但是组合在一起怎么就读不懂了呢?相信你也有这个烦恼。

  • 最主要是看ViewModel.

  • 首先看HarmonyOS 官房的图解还是比Android的简单,基本的理解就是靠ViewModel 去刷新 View视图,那一句话讲完,ViewModel 是什么? 那就是状态变量,例如@State ,@Provide,@Link等等。

  • 层级
    MVVM层级图.png

  • 相关状态

相关状态.png

  • 事件驱动

事件驱动.png

  • 事件回传渲染

渲染View.png

  • 简单理解:基本是按官房定义走,Model层写处理回调函数,同步ViewModel ,刷新View。
  • Demo 说明 :进入闪屏页,倒计时进入主页面,主页面首次加载进行骨架屏展示,等待数据从网络中获取,驱动显示页面。

效果展示

静态效果

闪屏页骨架屏主页主页
splash.pngskeletonview.pngindex1.pngindex2.png

动态效果

MVVM最佳实践.gif

最后

烦请大佬们,多多赐教,Gitee地址 gitee.com/HoCham/MVVM…