双向绑定一般是用 v-model 或者 .sync, 这两个都是语法糖,以 v-model 为例,它其实是 v-bind:value 和 v-on:input 的组合实现:

    1. v-bind:value 实现了 data => UI 的单向绑定
    2. v-on:input 实现了 UI => data 的单向绑定

    这两个单向绑定如何实现的呢?

    1. 前者通过 Object.defineProperty 给 data 创建 getter 和 setter, 用于监听 data 的变化,data 一变就改变 UI
    2. 后者通过 template compiler 给 DOM 添加事件监听, DOM input 的 value 变了就去修改 data