Vue.js双向绑定的实现原理

2017-04-27  本文已影响63人  Allan要做活神仙

先了解如何实现绑定,见http://www.jianshu.com/p/e9b81fec00b8

然后要实现


html
js

首先将该任务分成几个子任务:
   1、输入框以及文本节点与 data 中的数据绑定
   2、输入框内容变化时,data 中的数据同步变化。即 view => model 的变化。
   3、data 中的数据变化时,文本节点的内容同步变化。即 model => view 的变化。
要实现任务一,需要对 DOM 进行编译,这里有一个知识点:DocumentFragment

DocumentFragment
DocumentFragment(文档片段)可以看作节点容器,它可以包含多个子节点,当我们将它插入到 DOM 中时,只有它的子节点会插入目标节点,所以把它看作一组节点的容器。使用 DocumentFragment 处理节点,速度和性能远远优于直接操作 DOM。Vue 进行编译时,就是将挂载目标的所有子节点劫持(真的是劫持,通过 append 方法,DOM 中的节点会被自动删除)到 DocumentFragment 中,经过一番处理后,再将 DocumentFragment 整体返回插入挂载目标。

    var dom = nodeToFragment(document.getElementById('app'));
    console.log(dom);

    function nodeToFragment(node){
        var flag = document.createDocumentFragment();
        var child;
        while (child = node.firstChild){    // 给child赋值,然后判断child是否为真
            flag.append(child);             // 劫持node的所有子节点
        }
        return flag;
    }

    document.getElementById('app').appendChild(dom);
1
上一篇下一篇

猜你喜欢

热点阅读