响应式原理
数据驱动
- 数据响应式
- 数据模型仅仅是普通的JavaScript对象,而当我们修改数据时,视图会进行更新,避免了繁琐的DOM操作,提高开发效率
- 双向绑定
- 数据改变,视图改变;视图改变,数据也随之改变
- 我们可以使用v-model在表单元素上创建双向绑定数据
- 数据驱动
- 开发过程中仅需要关注数据本身,不需要关心数据是如何渲染到视图
Vue2 数据响应式核心原理:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">
hello
</div>
</body>
<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>
</html>
Vue3 数据响应式原理:
- Proxy介绍
- 直接监听对象,而非属性
- ES6中新增,IE不支持,性能由浏览器优化
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<div id="app">hello</div>
</body>
<script>
let data = {
msg: "hello",
count: 22,
};
let vm = new Proxy(data, {
get(target, key) {
console.log("get:", key, target[key]);
return target[key];
},
set(target, key, newValue) {
console.log(console.log("set:", key, newValue));
if (target[key] === newValue) {
return;
}
target[key] = newValue;
document.querySelector("#app")<