vue 双向数据绑定的原理

vue

vue2.0 通过ES5: Object.defineProperty

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8" />

<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<title>vue2.0 数据双向绑定</title>

</head>

<body>

姓名:<span ></span>

<br />

<input type="text" />

<script>

/**

* 通过ES5: Object.defineProperty

* 数据改变,触发视图重新渲染。视图改变,触发数据改变。

*/

let obj = {

name: "",

};

/**

* 简单实现深克隆

* 接收改变后的值,避免死循环

*/

let newObj = JSON.parse(JSON.stringify(obj));

// 监听 obj 中 name 值的改变

Object.defineProperty(obj, "name", {

get() {

return newObj.name; // 通过新的变量接收改变后的值,避免出现死循环的情况

},

set(val) {

if (val === newObj.name) return;

newObj.name = val;

observer();

},

});

// 观察者

function observer() {

spanName.innerHTML = obj.name; // 获取 obj值的时候会触发 get() 获取最新的值

inpName.value = obj.name;

}

// observer();

/**

* 模拟修改数据

* 数据的更改影响视图

*/

setTimeout(() => {

obj.name = "测试";

}, 1000);

/**

* 监听 input 文本框的改变

* 视图的改变影响数据

* 相当于 v-model

*/

inpName.oninput = function () {

obj.name = this.value;

};

/**

* 存在的问题:

* 1.需要对原始数据进行克隆

* 2.需要分别给对象中每一个属性设置监听

*/

</script>

</body>

</html>

vue3.0 通过ES6 Proxy 拦截器实现数据双向绑定

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8" />

<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<title>vue3.0 实现数据的双向数据绑定</title>

</head>

<body>

姓名:<span ></span>

<br />

<input type="text" />

<script>

/**

* 通过ES6 Proxy 拦截器实现数据双向绑定

* 1.不需要克隆

* 2.不需要对对象的每个属性设置监听

*/

let obj = {};

/**

* 监听整个对象

* 不需要指定属性

* 把当前对象的所有属性都监听(截持)了

*/

obj = new Proxy(obj, {

get(target, prop) {

// target 就是 obj

return target[prop];

},

set(target, prop, value) {

target[prop] = value;

observer();

},

});

// 观察者

function observer() {

spanName.innerHTML = obj.name; // 获取 obj值的时候会触发 get() 获取最新的值

inpName.value = obj.name;

}

/**

* 模拟修改数据

* 数据的更改影响视图

*/

setTimeout(() => {

obj.name = "测试";

}, 1000);

/**

* 监听 input 文本框的改变

* 视图的改变影响数据

* 相当于 v-model

*/

inpName.oninput = function () {

obj.name = this.value;

};

</script>

</body>

</html>

.

以上是 vue 双向数据绑定的原理 的全部内容, 来源链接: utcz.com/z/378730.html

回到顶部