什么是数据驱动
数据模型仅仅是普通的 JavaScript 对象,而当我们修改数据时,视图会进行更新,避免了繁琐的 DOM 操作,提高开发效率
数据改变时,视图改变;视图改变,数据也随之变化
我们可以使用 v-model 在表单上闯将双向数据绑定
开发过程中,只需要关注数据本身,不需要关心数据如何渲染收到视图;
数据响应的核心原理
Vue2.x
Object.defineProperty es5 新增方法,无法兼容 ie8 一下版本
极简模拟:
// 模拟 Vue 中的 data 选项
let data = {
msg: 'damo'
}
// 模拟 Vue 的实例
let vm = {}
// 数据劫持,当访问或者设置 vm 中的成员的时候,做一些干预操作
Object.defineProperty(vm, 'msg', {
// 可枚举(可遍历)
enumerable: true,
// 可配置(可以通过delete 删除,可以通过defineProperty 重新定义)
configurable: true,
// 当获取值的时候执行
get() {
return data.msg
},
// 当设置值的时候执行
set(newValue) {
if (newValue === data.msg) {
return
}
data.msg = newValue
// 数据更改,更新 DOM 的值
// ......
}
})
data.msg = 'damo-1'
复制代码
注:如果有一个对象多个属性需要转换 getter/setter,就需要循环处理;
Vue3.x
Proxy: 直接监听对象,而非属性;ES6 新增,IE 不支持,性能由浏览器优化;
极简模拟
// 模拟 Vue 中的 data 选项
let data = {
msg: 'damo',
sum: 2
}
// 模拟 Vue 的实例
let vm = new Proxy(data, {
// 执行代理行为的函数
// 当访问 vm 的成员执行
get(target, key) {
return target[key]
},
// 当设置 vm 的成员会执行
set(target, key, newValue) {
if (target[key] === newValue) return
target[key] = newValue
// 数据更改,更新 DOM 的值
// ......
}
})
vm.msg = 'damo-1'
复制代码
评论