通过Object.defineProperty实现数据劫持
vue中双向绑定主要是通过数据劫持和发布订阅者模式实现的。
1)数据劫持、vue是通过Object.defineProperty()来实现数据劫持,其中会有getter()和setter方法;当读取属性值时,就会触发getter()方法,在view中如果数据发生了变化,就会通过Object.defineProperty( )对属性设置一个setter函数,当数据改变了就会来触发这个函数;
以下是自己写的一个最简单的双向绑定实现方法:文本框输入数据,使得对象中的某个属性改变(可以理解为vue中data里的属性值),然后将新的值用p标签渲染到页面上。此时还没有使用发布订阅者模式实现全局更新
<body>
<input type="text">
<p></p>
<script>
var obj = {
name:"刘某",
age:22
}
Object.defineProperty(obj,"age",{
get(){
console.log("age属性被读取了");
},
set(newVal){
console.log("age属性被修改了,新值是:"+newVal);
document.querySelector("p").innerText = newVal;
}
})
document.querySelector("input").addEventListener("keyup",function (e) {
obj.age = e.target.value;
})
</script>
</body>
此时就实现了单个数据的双向绑定,可以理解为1对1绑定,那么实际开发中我们的页面上会有很多地方引用到vue里的data数据,一个数据又可能会被页面上很多地方所引用到,此时就需要发布-订阅者模式来帮助我们实现数据的全局更新,也就是提供一对多的方式更新页面的最新数据。
发布订阅者模式
详细可见此篇博客:
通俗易懂了解Vue双向绑定原理及实现