Vue实现双向绑定是采用数据劫持配合发布者-订阅者模式的方式,通过Object.defineProperty()
劫持各个属性的getter
和setter
,当数据变动时发布消息给订阅者,并触发对应的事件回调。
<body>
<div id="app">
<div>
name: {{name}}
</div>
<div>
<input type="text" v-model="name">
</div>
<button @click="onClick">change name</button>
</div>
</body>
<script src="./src/index.js"></script>
<script>
let mvvm = new MVVM({
el: '#app',
data: {
name: 'allen',
},
methods: {
onClick(){
this.name = 'curry'
}
}
});
</script>
- 实现一个数据监听器
Observer
,对数据对象的所有属性继续监听,如有变动获取最新值并通知订阅者。 - 实现一个指令编译器
Compile
,对每个元素节点的指令进行扫描,绑定相应事件,替换模板数据,并视图初始化。 - 实现一个订阅器
Watcher
,作为Observer
和Compile
的中间桥梁,在解析指令时,添加订阅到Watcher
里,当数据变动时,收到来自Observer
的通知,执行绑定的回调函数,从而更新视图。 - MVVM作为入口函数,整合以上三者。
yarn start