双向绑定原理
vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的
vue是如果进行数据劫持的?
- vue2.0 采用的是
Object.defineProperty进行数据劫持的 - vue3.0 采用的是
proxy
具体过程
(1):首先数据发生改变
(2):通过Object.defineProperty()截取; set()修改值、get() 获取值
(3):set方法有一个通知机制,只要你一修改,它马上就会通知watcher 监听器
(4):watcher 就会告知虚拟dom哪个节点发生了改变
(5):经过diff算法生成新的dom树。然后两个树进行比较,发现不一样的节点
(6):把新的节点更新到真实dom上。
总结:说的简单点-
v-model原理其实就是给input事件绑定oninput事件 就会立刻调用底层对象对应的setter方法 改变data里的属性的值 从而实现双向数据绑定。
响应式原理
概念
所谓数据响应式就是:能够使数据被监测并对这种变化做出响应式的机制。
MVVM框架要解决的就是连接数据层和视图层,这就是又回到了上面的具体过程了!
vue2中的数据响应式会根据数据类型来做不同处理
-
如果是对象则采⽤
Object.defineProperty()的⽅式定义数据拦截,当数据被访问或发⽣变化时,我们感知并作出响应; -
如果是数组则通过覆盖数组对象原型的
7个('push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse')变更⽅法,使这些⽅法可以额外的做更新通知,从⽽作出响应。这种机制很好的解决了数据响应化的问题。-
但在实际使⽤中也存在⼀些缺点:⽐如初始化时的递归遍历会造成性能损失;
-
新增或删除属性时需要⽤户使⽤Vue.set/delete这样特殊的api才能⽣效;
-