双向数据绑定
vue2 双向数据绑定
1、视图
function updateView() {
console.log("更新视图");
}
2、绑定对象监听
// 绑定对象监听
function defineReactive(target, key, val) {
// 深度监听 (值嵌套对象)
observer(val);
Object.defineProperty(target, key, {
get() {
return val;
},
set(newVal) {
if (newVal != val) {
// 关键点1
observer(newVal);
val = newVal;
// 更新视图
updateView();
}
}
})
}
代码解释:
(1)关键点1:深度监听(避免重新设置值为对象,导致新的值无法监听到)一次性全部递归监听
3、绑定数组监听
// 绑定数组监听
const arrProto = Object.create(Array.prototype);
// 将数组方法复写挂载到新对象中
['push', 'pop', 'shift', 'unshift', 'splice'].forEach(methodName => {
arrProto[methodName] = function() {
// 更新视图
updateView();
// 执行原型链的方法
oldArrayProperty[methodName].call(this, ...arguments);
}
})
arrProto = Object.create(oldArrayProperty)
:创建新对象,并且该对象的原型指向数组原型Array.prototype
( 目的:在新对象上拓展方法,不会影响原型对象)
4、observer
function observer(target) {
if (typeof target !== 'object' || target == null) {
return target;
}
// 数组
if (Array.isArray(target)) {
// 修改数组原型指向
target.__proto__ = arrProto;
}
for (let key in target) {
defineReactive(target, key, target[key]);
}
}
5、使用
const data = {
name: "haohao",
age: 20,
info: {
sex: "男",
},
test: "",
nums: [1, 2, 3]
}
// 双向绑定
observer(data);
6、测试
-
监听基本属性