1.双向数据绑定的原理:属性拦截
2.属性拦截实现方式 : 使用Object.defineProperty()将对象的属性变成访问器属性。
3.如果对访问器属性不是很了解的小伙伴可以看一下这一篇文章哈:JS数据属性与访问器属性
4.本小节主要模拟vue的双向数据绑定原理,由于vue渲染数据使用了虚拟DOM技术,比较复杂,所以这里笔者就稍微了写简单一些哈。主要的目的是为了双向绑定的原理,而不是虚拟DOM渲染的原理。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<input type="text" placeholder="请输入文本" v-model="{{ msg }}"><br>
您输入的文本是:<p>{{ msg }}</p> <br>
<button onclick="app.msg = '我是黑马保健坤'">点我修改文本</button>
</div>
<script>
function hmVue(obj) {
this.el = document.querySelector(obj.el);
this.msg = obj.data.msg;
this._msg = this.msg;
Object.defineProperty(this, "msg", {
get: function () {
console.log('有人想要读取我的值');
return this._msg;
},
set: function (newValue) {
console.log('外部赋值时的传参' + newValue);
this._msg = newValue;
input.value = newValue;
var p = document.querySelector('p');
p.innerText = newValue;
}
});
var input = document.querySelector(`${obj.el} [v-model]`);
input.oninput = function(){
this.msg = input.value;
}.bind(this);
};
var app = new hmVue({
el: '#app',
data: {
msg: ''
}
});
</script>
</body>
</html>