Vue数据绑定底层原理的实现

1.底层原理:数据的劫持,通过ES6中的defineproperty方法实现:

// var obj = {};

// Object.defineProperty(obj, 'name', {

//        get: function() {

//            console.log('我被获取了')

//            return val;

//        },

//        set: function (newVal) {

//            console.log('我被设置了')

//        }

// })

// obj.name = 'fei';//在给obj设置name属性的时候,触发了set这个方法

// var val = obj.name;//在得到obj的name属性,会触发get方法

上边已经实现了简单的数据绑定,如果把它与表单框结合起来并添加一个监听器的情况下:

var obj = {};

        var demo = document.querySelector('#demo')

        var inp = document.querySelector('#inp')

        Object.defineProperty(obj, 'name', {

            get: function() {

                // console.log('获取')

                return val;

            },

            set: function (newVal) {//当该属性被赋值的时候触发

                // inp.value = newVal;

                demo.innerHTML = newVal;

            }

        })

        inp.addEventListener('input', function(e) {

            // 给obj的name属性赋值,进而触发该属性的set方法

            obj.name = e.target.value;

        });

        // obj.name = '';//在给obj设置name属性的时候,触发了set这个方法

        // var val = obj.name

当inp的value值发生改变时demo的innerHTML也会随之发生改变,这样就实现了简单的数据双向绑定

Vue数据的劫持结合发布者-订阅者模式实现数据的双向绑定:

(1)、通过observer(即objectdefindproperty的set)循环递归对所有数据对象进行监听,这样的话给每个对象赋值就会触发setter,那么就能监听到数据的变化,

   (2)、实现一个指令解析器compile,对每个dom节点的指令进行扫描解析,根据指令模板替换数据,绑定相应的更新函数,

   (3)、实现一个Watcher(即订阅者,即每个指令绑定的属性),作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图


小弟不才,对于发布者、订阅者模式认知较浅,欢迎大佬指教...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文是lhyt本人原创,希望用通俗易懂的方法来理解一些细节和难点。转载时请注明出处。文章最早出现于本人github...
    lhyt阅读 2,241评论 0 4
  • vue理解浅谈 一 理解vue的核心理念 使用vue会让人感到身心愉悦,它同时具备angular和react的优点...
    ndxs2008阅读 24,201评论 2 18
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,258评论 0 6
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,915评论 2 17
  • 今天遇到一些事 1旧情已逝 今天上午,她用qq发消息给我。我第一时间看到,并且很快回复了过去。聊天中,听她电话那头...
    知足就好阅读 331评论 0 1