Men的博客

欢迎光临!

0%

vue2数据驱动原理

首先通过 Object.defineProperty 遍历数据 data 劫持每个属性的 getter 和 setter 生成 Observer,通过一个 Depend 收集依赖,然后在数据发生变化时通知消息给 Watcher,触发相应监听回调,然后达到数据驱动视图的目的
// 第 1 步: 定义数据和视图
var model = {
isShow: false
}
var view = document.querySelector(‘div’)

// 第 2 步: 定义视图刷新方法
var updateView = function(value) {
view.style.display = value ? ‘’ : ‘none’
}

// 第 3 步: 设置初始视图表现
var directiveKey = view.getAttribute(‘v-show’)
updateView(model[directiveKey])

// 第 4 步: 监听数据变化,然后刷新视图,达到数据驱动的目的
Object.defineProperty(model, ‘isShow’, {
set: function(val) {
updateView(val)
}
})
vue3是采用数据劫持结合发布者-订阅者模式的方式,通过new Proxy()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
3.proxy比Object.defineProperty好在哪里?

proxy优势:

A.可以直接监听对象而非属性

B.可以直接监听数组的变化

C.Proxy有多达13种拦截方式,不限于apply、ownKeys、deleteProperty、has等等是Object.defineProperty不具备的

D.Proxy返回的是一个新对象,可以只操作新的对象达到目的,而Object.defineProperty只能遍历对象属性直接修改

Object.defineProperty的优势:

A.兼容性好,支持IE9,而Proxy的存在浏览器兼容性问题,而且无法用polyfill磨平。