单项数据流

<!DOCTYPE html>
<html lang="en">
<head>
<title></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">

</head>
<body>

<div id="app">
<input type="text" v-model="msg">
{{msg}}

</div>
<script>
//先判断作用域内部是否有子元素
function isChild(node){
if(node.childNodes.length===0){
return false
}
else{
return node
}
}
//将节点加入文档碎片
function nodeToFragment(node,vm){
var frag= document.createDocumentFragment();
var child;
while(child = node.firstChild){
//开始赋值
compile(child,vm);
if(isChild(child)){
//判断子节点内部的子节点
nodeToFragment(isChild(child),vm)
}
frag.appendChild(child)

        }
        node.appendChild(frag);
        //将碎片在加入作用域
    }
    function compile(node,vm){
        if(node.nodeType === 1){
            //如果节点为元素
             var attr = node.attributes;  
             //获取该元素的属性          
            for(var i=0;i<attr.length;i++){
                //获取自定义属性 v-model
                if(attr[i].nodeName === 'v-model'){
                    //获取值 则为 data.属性名 v-model="msg"中的msg  
                    var name = attr[i].nodeValue;
                   
                    //该元素的 值为app 中data 的
                    node.value=vm.data[name];
                    //使用后删除该属性
                    node.removeAttribute(attr[i].nodeName)
                }
            }
        }
          if(node.nodeType === 3){

            //如果为文本 进行正则判断

            var reg = /\{\{(.*)\}\}/;
       
        if(reg.test(node.nodeValue.trim())){
            
            //将正则匹配到的{{}}中的字符串赋值给name

            var name = RegExp.$1;
            
            //利用name对应赋值相应的节点值

            node.nodeValue = vm.data[name];
           
        }
    }
}
    
     
        function Vue(options){
           //封装一个vue
            this.id=options.el;
            this.data=options.data;
            nodeToFragment(document.getElementById(this.id),this)
        }
        var vm=new Vue({
             //初始化一个vue 
            el:'app',
            data:{
                msg:'hello,two-ways-binding'
            }
        })
</script>
</body>

</html>

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

推荐阅读更多精彩内容

  • 什么是单向数据流? 数据从父组件传递给子组件,只能单向绑定。在子组件内部不应该修改父组件传递过来的数据。 子组件不...
    MC丶逗逼嘿阅读 2,828评论 0 1
  • 一直在学习 javascript,也有看过《犀利开发 Jquery 内核详解与实践》,对这本书的评价只有两个字犀利...
    独念白阅读 1,612评论 0 2
  • 本章内容 理解包含不同层次节点的 DOM 使用不同的节点类型 克服浏览器兼容性问题及各种陷阱 DOM 是针对 HT...
    闷油瓶小张阅读 3,947评论 0 1
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 12,378评论 2 17
  • 古代伟大的先哲荀子曾经说过“人之性恶,其善者伪也。”(《荀子·性恶》)也就是说荀子认为人的本性是邪恶的,他们那些善...
    墨雪晨阅读 3,973评论 0 0