数据驱动
- 数据响应式、双向绑定、数据驱动
- 数据响应式
- 数据模型仅仅是普通的JavaScript对象,而当我们修改数据时,视图会进行更新,避免了繁琐的DOM操作,提高开发效率
- 双向绑定
- 数据改变,视图改变;视图改变,数据也随之改变
- 我们可以使用v-model 在表单元素上创建双向数据绑定
所以 双向绑定针对的是和用户有交互的表单元素 - 数据驱动是Vue 最独特的特性之一
- 开发过程中仅需关注数据本身(业务本身),不需要关心数据是如何渲染到视图
总结
数据驱动就是一种开发过程,在这个开发过程中,程序员不需要关注如何把数据渲染到DOM上,因为现在主流的MVVM框架内部已经帮我们实现了数据响应式以及双向绑定。
数据响应式核心原理
- 官方解释

Object.defineProperty是ES5中一个无法shim的特性
shin特性意思是无法降级处理的 重点:浏览器兼容IE8以上(不兼容IE8及以下)
数据响应式核心原理
当给data 中msg 属性重新赋值的时候,把新的值渲染到div 中来,整个DOM 操作不希望在外部赋值的时候去做,所以这里做了一个数据劫持
数据劫持如何去实现
通过definProperty实现数据劫持
Object.definProperty 方法参数
- 第1个参数:vm是Vue实例对象
- 第2个参数:给vm对象增加的一个属性
- 第3个参数:属性描述符,可以给
msg 属性设置get 、set 方法等 当访问msg 的时候会执行get 方法,当给msg 重新赋值的时候回执行set 方法
Vue 2.x中响应式原理
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>defineProperty</title>
</head>
<body>
<div id="app">
hello
</div>
<script>
let data = {
msg: 'hello',
count: 10
}
let vm = {};
proxyData(data);
function proxyData(data) {
Object.keys(data).forEach(key => {
Object.defineProperty(vm, key, {
enumerable: true,
configurable: true,
get() {
console.log('get: ', data[key])
return data[key]
},
set(newValue) {
console.log('set: ', newValue)
if (newValue === data[key]) {
return
}
data[key] = newValue;
document.querySelector('#app').textContent = data[key];
}
})
})
}
vm.msg = 'Hello World';
console.log(vm.msg);
</script>
</body>
</html>

Vue 3.x响应式原理
|