解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-model="hey"><input class="test" type="" name="" onkeyup="handleChange()" v-model="msg"><script type="text/javascript">    //定义一个变量    var bindingMark = ‘data-element-binding‘

function Element(classa, initData) {        console.log("this zhi");        console.log(this);        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];        console.log("outerHTML")        console.log(e.target.outerHTML);        console.log("key:  " + key);        data[key] = e.target.value        console.log(data.hey, data.msg);    }</script></body></html>

https://www.cnblogs.com/dh-dh/p/5606596.html

原文地址:https://www.cnblogs.com/geekjsp/p/9550172.html

时间: 2024-10-16 03:03:58

解vue的数据binding原理(转)的相关文章

详解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>

vue响应数据的原理

vue最大的特点就是数据驱动视图. vue的数据改变,页面一定发生改变?不一定. 当操作引用类型的数据,动态添加属性时,页面不会发生改变. vue提供一个实例方法:vm.$set()可以添加一个响应式属性,会触发视图的更新. vue响应式数据原理(也叫数据绑定原理.双向数据绑定原理): 底层是Object.defineProperty(),目前用的vue2.6版本和将来更新的vue3.0(proxy)都是通过给data中的数据加一个数据劫持(setter和getter方法).但是不管哪种版本,i

Vue实现数据双向绑定的原理

Vue实现数据双向绑定的原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调.当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter.用户看不

Hbase数据存储原理与读写详解

1.HBase的数据存储原理 一个HRegionServer会负责管理很多个region 一个*region包含很多个store 一个列族就划分成一个store** 如果一个表中只有1个列族,那么每一个region中只有一个store 如果一个表中有N个列族,那么每一个region中有N个store 一个store里面只有一个memstore memstore是一块内存区域,写入的数据会先写入memstore进行缓冲,然后再把数据刷到磁盘 一个store里面有很多个StoreFile, 最后数据

Vue.js响应式原理

本文和大家分享的主要是Vue.js 响应式原理相关内容,一起来看看吧,希望对大家 学习Vue.js有所帮助. 关于Vue.js Vue.js 是一款 MVVM 框架,上手快速简单易用,通过响应式在修改数据的时候更新视图. Vue.js 的响应式原理依赖于 Object.defineProperty  ,尤大大在Vue.js 文档中就已经提到过,这也是 Vue.js 不支持 E8 以及更低版本浏览器的原因. Vue 通过设定对象属性的  setter/getter  方法来监听数据的变化,通过 g

vue的双向绑定原理及实现

前言 使用vue也好有一段时间了,虽然对其双向绑定原理也有了解个大概,但也没好好探究下其原理实现,所以这次特意花了几晚时间查阅资料和阅读相关源码,自己也实现一个简单版vue的双向绑定版本,先上个成果图来吸引各位: 代码:                                                                    效果图:   是不是看起来跟vue的使用方式差不多?接下来就来从原理到实现,从简到难一步一步来实现这个SelfVue.由于本文只是为了学习和分享

转载:深入了解Struts2返回JSON数据的原理及具体应用范例

早在我刚学Struts2之初的时候,就想写一篇文章来阐述Struts2如何返回JSON数据的原理和具体应用了,但苦于一直忙于工作难以抽身, 渐渐的也淡忘了此事.直到前两天有同事在工作中遇到这个问题,来找我询问,我又细细地给他讲了一遍之后,才觉得无论如何要抽一个小时的时间来写这篇文章, 从头到尾将Struts2与JSON的关系说清楚. 其实网络中,关于这个问题的答案已是海量,我当初也是从这海量的答案中吸收精华,才将“Struts2返回JSON数据”这个问题搞清楚的.但 是这些海量的答案,有一个共同

Android应用程序组件Content Provider在应用程序之间共享数据的原理分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用程序是不能直接读写对方的数据文件的,如果它们想共享数据的话,只能通过 Content Provider组件来实现.那么,Content Provider组件又是如何突破应用程序边界权限控制来实现在不同的应用程序之间共享数据的呢?在前面的文章中,我们已经简要介绍过它是通过 Binder进程间通信机制以

(项目实战)大数据Kafka原理剖析及(实战)演练视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv