资讯专栏INFORMATION COLUMN

前端MVVM模式及其在Vue和React中的体现

沈建明 / 1909人阅读

摘要:在模式中一般把层算在层中,只有在理想的双向绑定模式下,才会完全的消失。层将通过特定的展示出来,并在控件上绑定视图交互事件,一般由框架自动生成在浏览器中。三大框架的异同三大框架都是数据驱动型的框架及是双向数据绑定是单向数据绑定。

MVVM相关概念

1) MVVM典型特点是有四个概念:Model、View、ViewModel、绑定器。MVVM可以是单向绑定也可以是双向绑定甚至是不绑定
2) 绑定器:声明性的数据和命令,存在于ViewModel之中,让ViewModel和Model二者进行自动或手动通信,接下来的“MVVM在React中对应关系”小节有举例说明。
3) MVVM本质上是M- V-C-VM,它是在MVC的基础上增加了一层VM,只不过C变弱了,被并入到M概念中,VM用于分离V和M,并且让用户避免由于直接操作V层的DOM而带来的繁琐和效率低下,MVVM使开发更高效,结构更清晰,增加代码的复用性。
4) 在不同的GUI(图形用户界面)上进行展示时,Model、Controller、View-Model能够复用,只需把View层进行替换。
5) 在不同类型的UI(用户界面)上进行展示时,Model、Controller能够复用,只需把View-Model、View层进行替换。比如:假设我们开发的是一款针对盲人的应用,那么输出设备或许我们需要考虑使用扬声器来代替显示器,输入设备使用麦克风,这时我们只需将上述的View-Model替换为Audio-Model作为语音模型,将 V(iew)层替换为Audio层用于播放语音和接收语音输入。
6) 个人认为:在基于MVVM框架的项目中,不管是双向数据绑定还是单向数据绑定,你在开发中实际要面对的都是ViewModel和M(odel)层之前的通信,因为V(iew) 和ViewModel层之间的映射和通信都是由框架自动完成的,

MVVM四层结构

1) M(odel)层:模型,定义数据结构。
2) C(ontroller)层:实现业务逻辑,数据的增删改查。在MVVM模式中一般把C层算在M层中,(只有在理想的双向绑定模式下,Controller 才会完全的消失。这种理想状态一般不存在)
3) ViewModel层:顾名思义是视图View的模型、映射和显示逻辑(如if for等,非业务逻辑),另外绑定器也在此层。ViewModel是基于视图开发的一套模型,如果你的应用是给盲人用的,那么也可以开发一套基于Audio的模型AudioModel。
4) V(iew)层:将ViewModel通过特定的GUI展示出来,并在GUI控件上绑定视图交互事件,V(iew)一般由MVVM框架自动生成在浏览器中。

MVVM在React中对应关系

1) M(odel):对应组件的方法或生命周期函数中实现的业务逻辑和this.state中保存的本地数据,如果React集成了redux +react-redux,那么组件中的业务逻辑和本地数据可以完全被解耦出来多带带存放当做M层,如业务逻辑放在Reducer和Action中。
2) V(iew)-M(odel):对应组件中的JSX,它实质上是Virtual DOM的语法糖。React负责维护 Virtual DOM以及对其进行diff运算,而React-dom 会把Virtual DOM渲染成浏览器中的真实DOM
3) View:对应框架在浏览器中基于虚拟DOM生成的真实DOM(并不需要我们自己书写)以及我们书写的CSS
4)绑定器:对应JSX中的命令以及绑定的数据,如className={ this.props.xxx }、{this.props.xxx}等等

MVVM的双绑和单绑区别

1) 一般,只有UI表单控件才存在双向数据绑定,非UI表单控件只有单向数据绑定。
2) 单向数据绑定是指:M的变化可以自动更新到ViewModel,但ViewModel的变化需要手动更新到M(通过给表单控件设置事件监听)
3) 双向数据绑定是指念:M的变化可以自动更新到ViewModel,ViewModel的变化也可以自动更新到M
4) 双向绑定 = 单向绑定 + UI事件监听。双向和单向只不过是框架封装程度上的差异,本质上两者是可以相互转换的。
5) 优缺点:在表单交互较多的情况下,单向数据绑定的优点是数据更易于跟踪管理和维护,缺点是代码量较多比较啰嗦,双向数据绑定的优缺点和单向绑定正好相反。

三大框架的异同

1) 三大框架都是数据驱动型的框架
2) vue及angular是双向数据绑定;react是单向数据绑定。React貌似使用的也是Object.defineProperty监控数据,只是没有进一步把表单控件的事件封装进v-model
3) Vuex、Redux都是单项数据绑定的,即M的变化可以自动更新到V,但V的变化必须手动触发事件更新到M,这种单项数据绑定使数据更易于跟踪管理和维护。
4) 未完待续……

Vue双向绑定原理

1) Vue的双向数据绑定是通过Object.defineProperty的get/set对M层数据进行监控,当数据发生变化时,自动更新VM层绑定的数据,而当用户更改了VM层表单控件的数据时,通过v-model自动更新到M层(v-model是对表单控件的事件的封装)
精简示例:

2)我们已经知道Vue是双向数据绑定(通过v-model),Vuex是单向数据绑定,那么问题来了,在基于Vue+ Vuex的项目中,Vuex中的数据是不允许Vue的v-model对其进行更改的,会报错,有如下三种解决方案:

依然使用v-model,数据不放进Vuex中,而是放在组件自身的data属性中

依然使用v-model,不过取值不再是Vuex中的数据,而是组件自身的一个computed(getter/setter)或watch,通过computed或watch里的回调来把数据变化提交(commit)到Vuex
组件模板:

组件VUE实例:

computed: {
    newName: {
      get () {
        return this.$store.state.name
      },
      set (val) {
        this.$store.commit("changeName", val) //当newName 值发生改变时,提交一个mutation:changeName,用于改变store中的name/
      }
    }
  }

mutation:

 changeName (state, val) {
   state.name = val
 }

不使用v-model,通过UI事件监听触发一个回调,然后手动把数据变化提交(commit)到Vuex

3)Vue的双向数据绑定和Vue的prop的单项数据流是两个不同的概念,数据绑定的前提是有数据流,但有数据流不一定有数据绑定。prop的单项数据流是指:prop可以把父组件的数据传递给子组件并且子组件不能对该数据进行直接修改更不能回流到父组件(当然,得益于Vue对所有数据使用了Object.defineProperty,所以prop传递的数据是绑定的,即父组件中该数据一旦发生变化,子组件中的也跟着变化)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98810.html

相关文章

  • MVVM框架理解及其原理实现

    摘要:小白一枚,一直使用的是,想要多了解一些其它的框架,正好最近越来越火热,上的数已经超过了。框架理解说起这个模型,就不得不说框架。函数表示创建一个文本节点,函数表示创建一个数组。 小白一枚,一直使用的是React,想要多了解一些其它的框架,正好最近Vue越来越火热,Github上的Star数已经超过了React。而其背后蕴含的MVVM框架思想也一直跟React的组件化开发思想并驾齐驱,在这...

    DevWiki 评论0 收藏0
  • vue进阶面试题

    摘要:面试的时候,相关技术原理也一定是必考点。好了,进入正题,今天在这里给大家带来一点的进阶面试题。指令是直接销毁和重建达到让元素显示和隐藏的效果。 Vue 越来越受欢迎了。放眼国内外,不管是 BAT 等大厂,还是创业公司,Vue 都有广泛的应用。面试的时候,Vue 相关技术原理也一定是必考点。可以说,对于任何一个前端工程师来说,掌握 Vue 可能不是一个可选项,而更像一门必修课。 很多人做...

    Donald 评论0 收藏0
  • vue进阶面试题

    摘要:面试的时候,相关技术原理也一定是必考点。好了,进入正题,今天在这里给大家带来一点的进阶面试题。指令是直接销毁和重建达到让元素显示和隐藏的效果。 Vue 越来越受欢迎了。放眼国内外,不管是 BAT 等大厂,还是创业公司,Vue 都有广泛的应用。面试的时候,Vue 相关技术原理也一定是必考点。可以说,对于任何一个前端工程师来说,掌握 Vue 可能不是一个可选项,而更像一门必修课。 很多人做...

    Gilbertat 评论0 收藏0
  • 前端练级攻略(第二部分)

    摘要:是文档的一种表示结构。这些任务大部分都是基于它。这个实践的重点是把你在前端练级攻略第部分中学到的一些东西和结合起来。一旦你进入框架部分,你将更好地理解并使用它们。到目前为止,你一直在使用进行操作。它是在前端系统像今天这样复杂之前编写的。 本文是 前端练级攻略 第二部分,第一部分请看下面: 前端练级攻略(第一部分) 在第二部分,我们将重点学习 JavaScript 作为一种独立的语言,如...

    BWrong 评论0 收藏0

发表评论

0条评论

沈建明

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<