vue实现数据双向绑定
时间: 2024-06-01 09:03:36 浏览: 99
Vue实现数据双向绑定的原理是利用了Object.defineProperty()方法对数据进行劫持,通过将data中的数据属性转换为getter和setter方法,从而实现对数据的监听和更新。
具体实现步骤如下:
1. 首先定义一个Vue类,用于创建Vue实例。
```
class Vue {
constructor(options) {
this._data = options.data
this._el = options.el
this._template = document.querySelector(this._el)
this._render = this.compile(this._template.innerHTML)
this._template.innerHTML = this._render(this._data)
this.observe(this._data)
}
observe(data) {
Object.keys(data).forEach(key => {
let value = data[key]
Object.defineProperty(data, key, {
get() {
console.log(`读取 ${key} 属性: ${value}`)
return value
},
set(newValue) {
console.log(`设置 ${key} 属性: ${newValue}`)
value = newValue
this._template.innerHTML = this._render(this._data)
}
})
})
}
compile(template) {
const reg = /\{\{(.+?)\}\}/g
let code = 'return `'
let cursor = 0
let match
while ((match = reg.exec(template))) {
code += template.slice(cursor, match.index)
code += '${' + match[1].trim() + '}'
cursor = match.index + match[0].length
}
code += template.slice(cursor)
code += '`'
return new Function('data', code)
}
}
```
2. 在Vue类的构造函数中,获取传入的data和el,并进行模板编译,然后对data中的属性进行监听。
3. 在observe方法中,使用Object.defineProperty()方法对data中的每个属性进行劫持。在getter方法中,输出读取属性的提示,并返回属性值;在setter方法中,输出设置属性的提示,更新属性值,并重新渲染模板。
4. 在compile方法中,使用正则表达式匹配模板字符串中的变量,将其替换为${variable}的形式,并生成一个新的模板字符串。
5. 最后,将生成的模板字符串转换为一个函数,该函数接受data作为参数,返回渲染后的HTML字符串。
使用示例:
```
const app = new Vue({
el: '#app',
data: {
message: 'Hello world!'
}
})
```
HTML模板:
```
<div id="app">
<p>{{ message }}</p>
<input v-model="message">
</div>
```
绑定了一个p标签和一个input元素,两个元素都绑定了message属性,当修改input元素的值时,p标签的内容也会跟着更新。
阅读全文