Vue学习——实现vue的双向数据绑定

vue

Vue的双向数据绑定原理?

 Vue是根据数据劫持结合发布者-订阅者模式来实现双向数据绑定的,利用object.defaultProperty()方法来获取每个属性 的setter,getter,在数据变动的时候分布消息给订阅者,触发响应的监听回调。

Object.defaultProperty()方法的使用 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty;

使用Object.defaultProperty实现双向数据绑定:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

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

<title>v-model的实现原理</title>

</head>

<body>

<input type="text">

<p></p>

<script src="./js/vue.js"></script>

<script>

//获取dom元素

var oP = document.querySelector("p");

var oInput = document.querySelector("input");

//创建一个值

let obj = {

_msg: "hello"

}

//使用方法给obj新添加一个属性,用于设置msg

Object.defineProperty(obj, "msg", {

get() {

return this._msg;

},

set(newValue) {

this._msg = newValue;

oP.innerHTML = newValue;

oInput.value = newValue;

}

})

//给obj的属性赋值

obj.msg = "hello world";

//如果发送了输入事件,就将输入的值赋值给obj

oInput.oninput = function(e) {

obj.msg = e.target.value;

}

</script>

</body>

</html>

利用v-on(绑定方法) 和v-bind(绑定属性)来实现v-model:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

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

<title>v-model的实现原理</title>

</head>

<body>

<div id="app">

{{msg}}

<div>

<!-- v-model绑定的原理:使用v-bind绑定属性,使用v-on绑定事件 -->

<input type="text" v-bind:value="msg" v-on:input="msg=$event.target.value">

<input type="text" v-bind:value="msg" v-on:input="changeValue">

<input type="text" v-model="msg">

</div>

</div>

<script src="./js/vue.js">

</script>

<script>

//创建一个vue实例

var vm = new Vue({

el: "#app",

data: {

msg: "hello world"

},

methods: {

changeValue: function(event) {

this.msg = event.target.value;

}

}

})

</script>

</body>

</html>

以上是 Vue学习——实现vue的双向数据绑定 的全部内容, 来源链接: utcz.com/z/376709.html

回到顶部