双向绑定一般是用 v-model 或者 .sync, 这两个都是语法糖,以 v-model 为例,它其实是 v-bind:value 和 v-on:input 的组合实现:
- v-bind:value 实现了 data => UI 的单向绑定
- v-on:input 实现了 UI => data 的单向绑定
这两个单向绑定如何实现的呢?
- 前者通过 Object.defineProperty 给 data 创建 getter 和 setter, 用于监听 data 的变化,data 一变就改变 UI
- 后者通过 template compiler 给 DOM 添加事件监听, DOM input 的 value 变了就去修改 data