详解vue的数据binding原理

请看原文:

草席两个页面:

<!DOCTYPE html>
<html>
    <head>
        <title>ideal</title>
        <meta charset="utf-8">
    </head>
    <body>
        <div id="test">
            <p>{{msg}}</p>
            <p>{{msg}}</p>
            <p>{{msg}}</p>
            <p>{{what}}</p>
            <p>{{hey}}</p>
        </div>
        <script>
            var bindingMark = ‘data-element-binding‘
            function Element (id, initData) {
                var self     = this,
                    el          = self.el = document.getElementById(id)
                    bindings = {} //内部暂存绑定数据及dom
                    data      = self.data = {} //存储bingding数据并实现监控
                    content  = el.innerHTML.replace(/\{\{(.*)\}\}/g, markToken)
                    el.innerHTML = content

                for (var variable in bindings) {
                    bind(variable); //将每个数据的名称比如‘msg‘绑定到data
                }
                if (initData) {
                    for (var variable in initData) {
                        data[variable] = initData[variable]
                    }
                }
                function markToken (match, variable) {
                    bindings[variable] = {} //bindings里存储了数据来源的字段比如bindings[‘msg‘]
                    return ‘<span ‘ + bindingMark + ‘="‘ + variable +‘"></span>‘
                }
                function bind (variable) {
                    bindings[variable].els = el.querySelectorAll(‘[‘ + bindingMark + ‘="‘ + variable + ‘"]‘)//bindings里再存储msg绑定的元素
                    ;[].forEach.call(bindings[variable].els, function (e) { //删除data-element-binding属性
                        e.removeAttribute(bindingMark)
                    })
                    Object.defineProperty(data, variable, { //es5观察属性
                        set: function (newVal) {
                            [].forEach.call(bindings[variable].els, function (e) {
                                bindings[variable].value = e.textContent = newVal //=>这里才是实现的绑定,更新数据到dom并更新内部暂存数据
                            })
                        },
                        get: function () {
                            return bindings[variable].value  //取数据仅仅是内部暂存的数据
                        }
                    })
                }
            }

            var app = new Element(‘test‘, {
                msg: ‘hello‘,
                what: ‘hi‘
            })

        </script>
    </body>
</html>

<!DOCTYPE html>
<html>
    <head>
        <title>ideal</title>
        <meta charset="utf-8">
    </head>
    <body>
        <input class="test" type="text" name="asd" onkeyup ="handleChange()" v-model="hey">
        <input class="test" type="" name="" onkeyup ="handleChange()" v-model="msg">
        <script>
            var bindingMark = ‘data-element-binding‘
            function Element (classa, initData) {
                var self     = this,
                    el          = self.el = document.getElementsByClassName(classa),//多个input改为class
                    bindings = {}
                    data      = self.data = {}
                    for (var i = 0; i < el.length; i++) {
                        content  = el[i].outerHTML.replace(/v-model=\"(.*)\"/g, markToken);
                        el[i].outerHTML = content
                    }
                for (var variable in bindings) {
                    bind(variable);
                }
                if (initData) {
                    for (var variable in initData) {
                        data[variable] = initData[variable]
                    }
                }
                function markToken (match, variable) {
                    bindings[variable] = {}
                    return  bindingMark + ‘="‘ + variable +‘"‘ //内填一个span变为只改它的元素
                }
                function bind (variable) {

                    bindings[variable].els = document.querySelectorAll(‘[‘ + bindingMark + ‘="‘ + variable + ‘"]‘)//document获取binding元素
                    ;
                    Object.defineProperty(data, variable, {
                        set: function (newVal) {
                            [].forEach.call(bindings[variable].els, function (e) {
                                bindings[variable].value = e.value = newVal //=>textContent改为input的value
                            })
                        },
                        get: function () {
                            return bindings[variable].value
                        }
                    })
                }
            }

            var app = new Element(‘test‘, {
                msg: ‘hello‘,
                hey:‘aaa‘
            })
            function handleChange(e){ //增加v=>m的绑定
                e = e || window.event
                var key = e.target.outerHTML.match(/data-element-binding=\"(.*)\"/)[1];
                data[key] = e.target.value
                console.log(data.hey,data.msg);
            }
        </script>
    </body>
</html>

原文地址:https://www.cnblogs.com/luohaonan/p/9964161.html

时间: 2024-08-08 04:14:07

详解vue的数据binding原理的相关文章

解vue的数据binding原理(转)

<!DOCTYPE html><html><head> <title>ideal</title> <meta charset="utf-8"></head><body><input class="test" type="text" name="asd" onkeyup="handleChange()" v-

详解音频编解码的原理、演进和应用选型等

本文来自网易云音乐音视频实验室负责人刘华平在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack根据演讲内容整理而成(本次演讲PPT文稿,请从文末附件下载). 1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性,Codec种类还是音频编解码复杂程度都远远比视频要高.视频的Codec目前还主要是以宏块为处理单元,预

详解Kafka: 大数据开发最火的核心技术

详解Kafka: 大数据开发最火的核心技术 架构师技术联盟 2019-06-10 09:23:51 本文共3268个字,预计阅读需要9分钟. 广告 大数据时代来临,如果你还不知道Kafka那你就真的out了(快速掌握Kafka请参考文章:如何全方位掌握Kafka核心技术)!据统计,有三分之一的世界财富500强企业正在使用Kafka,包括所有TOP10旅游公司,7家TOP10银行,8家TOP10保险公司,9家TOP10电信公司等等. LinkedIn.Microsoft和Netflix每天都用Ka

详解 Kubernetes Pod 的实现原理

Pod.Service.Volume 和 Namespace 是 Kubernetes 集群中四大基本对象,它们能够表示系统中部署的应用.工作负载.网络和磁盘资源,共同定义了集群的状态.Kubernetes 中很多其他的资源其实只对这些基本的对象进行了组合. Pod 是 Kubernetes 集群中能够被创建和管理的最小部署单元,想要彻底和完整的了解 Kubernetes 的实现原理,我们必须要清楚 Pod 的实现原理以及最佳实践. 在这里,我们将分两个部分对 Pod 进行解析,第一部分主要会从

LigerUI之Grid使用详解(三)——字典数据展示

一.问题概述 在开发web信息管理系统时,使用Web前端框架可以帮助我们快速搭建一组风格统一的界面效果,而且能够解决大多数浏览器兼容问题,提升开发效率.在关于LigerGrid的前两篇的内容里,给大家介绍了表格的基本的展示数据用法.(传送门:LigerUI之Grid使用详解(一)--显示数据 .LigerUi之Grid使用详解(二)--数据编辑 ) 在实际应用开发中,我们会经常遇到这样的场景,在展示业务数据的时候需要把业务数据中的参数项或者字典项的编码转换成参数名称或者字典名称展示出来.在这里本

OPCode详解及汇编与反汇编原理

1. 何为OPCode 在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处理器的指令规范指定.除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显示的操作数.这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等. OPCode在不同的场合中通常具有不同的含义,例如PHP虚拟机(Zend VM).java虚拟机(JVM)以及一些软件保护虚拟机中

详解vue 路由跳转四种方式 (带参数)

详解vue 路由跳转四种方式 (带参数):https://www.jb51.net/article/160401.htm 1.  router-link ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1. 不带参数  <router-link :to="{name:'home'}"> <router-link :to="{path:'/home'}"> //name,path都行, 建议用name /

CacheManager彻底解密:CacheManager运行原理流程图和源码详解(DT大数据梦工厂)

内容: 1.CacheManager重大价值: 2.CacheManager运行原理图: 3.CacheManager源码解析: BlockManager针对Cache这样的行为做了CacheManager Spark出色的原因: 1.Spark基于RDD构成了一体化.多元化的大数据处理中心(不需要再处理多种范式来部署多种框架,只要Spark!!!降低成本投入获得更高的产出): 2.迭代,因为在计算的时候迭代,在构建复杂算法的时候非常方便(图计算.机器学习.数据仓库),而CacheManager

【详解】DNS服务工作原理、正反向解析和主从同步

目录: 一.理论部分 二.实验部分 ******************************理论部分*************************************** 正文: 一.什么是DNS服务. DNS服务是互联网的基础性服务之一.全称为Domain Name System(域名系统).DNS是因特网上作为域名和IP地址相互映射的一个分布式数据库,提供将域名转换成对应IP地址的信息条目,能够使用户更方便的通过域名(如baidu.com)去访问互联网,而不用去记住能够被机器直接