Vue双向绑定的实现及原理

1.vue双向绑定的实现

v-xxx 是vue中的指令,
v-model是双向绑定

例1:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>双向绑定</title>
</head>
<body>
    <div class="app">
        <input type="text" class="txt" v-model=msg>
        {{msg}}
    </div>
</body>

<script src="../js/vue.js"></script>
<script>
    new Vue({
        el:'.app',
        data:{
            msg:'hello world'
        }
    })
</script>
</html>

2.Vue双向绑定的原理
vue数据双向绑定是通过 数据劫持 结合 发布者-订阅者模式 的方式来实现的;

数据劫持的实现方式 Object.defineProperty()

当你把一个普通的JavaScript 对象传入 Vue 实例作为 data 选项, Vue 将便利此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。

var Book = {
  name:'123456'
};
var name = "";
console.log(Book.name) //123456

Object.defineProperty(Book,'name',{
  set (value) {
     name = value;
     console.log(value) //123
   },
   get() {
      return '《' + name + '》'
    }
})
console.log(Book.name) // 《》 此处使用get的方法
Book.name = '123' // 相当于调用set方法
console.log(Book.name)  // 《123》

原理

  • 实现一个监听器Observer,用来劫持并监听所有属性,如果有变动的,就通知订阅者。
  • 实现一个订阅者Watcher,可以收到属性的变化通知并执行相应的函数,从而更新视图。
  • 实现一个解析器Compile,可以扫描和解析每个节点的相关指令,并根据初始化模板数据以及初始化相应的订阅器。
938664-20170522225458132-1434604303.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。