mvvm及双向绑定

mvvm

Posted by Lan on June 21, 2019

mvvm

MVC

简单而言就是

model, 数据 view, 视图 controller,业务处理

各部分之间的通信如图所示 在这里插入图片描述

view给controller,control给model,model再给view(之后对比mvvm)

MVVM

在这里插入图片描述

mvvm其实借鉴了桌面端mvc的思想 view同样是负责界面显示 model同样代表数据

## 而重点在于vm: vm即ViewModel,是连接model和view的桥梁。 一是将经由view操作的数据转换为model,二是将model中的数据传递给view. view和model并不能直接通信,都是借助于vm实现的

vm实质

  • Object.defineProperty demo ``` // 对obj上面的属性进行读取和设置监听 let obj = { name:’huahua’, age:18 } function observer(obj){ if(typeof obj === ‘object’){ for (const key in obj) { defineReactive(obj,key,obj[key]) } } } // get的return的值才是最终你读取到的值。所以设的值是为读取准备的。 // set传的参数是设置的值,注意这里不要有obj.name = newVal 这样又触发set监听,会死循环的。 function defineReactive(obj,key,value){ Object.defineProperty(obj,key,{ get:function(){ console.log(‘你在读取’) // happy的话这边可以value++,这样你发现读取的值始终比设置的大一个,因为return就是读取到的值 return value }, set:function(newVal){ console.log(‘数据更新了’) value = newVal }

      })   }   observer(obj)   obj.age = 2   console.log(obj.age)
    

```

实现的方式:DOM事件监听(这个目前还不是很能理解,之后要花时间理解后补充一下)

实际上vm会监听view的变化,一旦用户操作view使得view中的数据发生变化,就会通知model也随之变化,一旦model发生变化,view就随之变化

双向绑定

如果实现了两个方向的,就是实现了双向绑定。

思考

在vue中改变data中的一个属性字段,页面的数据显示就会发生变化,而实际上这里的model就是js的对象,改变js对象属性就是改变model