博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javascript实现数据的双向绑定(手动绑定)
阅读量:6723 次
发布时间:2019-06-25

本文共 2315 字,大约阅读时间需要 7 分钟。

今天来讲一下Javascript是如何实现数据的双向绑定,因为是第一次写文章所以是借鉴了一下别人的文章。根据别人的文章来谈一些自己的理解,废话不多说直接开始讲解。

首先数据双向绑定大家一定都不陌生(如angular,vue等),那么它的结构大致如下

复制代码

这跟vue的写法很像这是比较老的实现方式,有点像观察者编程模式,主要思路是通过在数据对象上定义get和set方法(当然还有其它方法),调用时手动调用get或set数据,改变数据后出发UI层的渲染操作;以视图驱动数据变化的场景主要应用与input、select、textarea等元素,当UI层变化时,通过监听dom的change,keypress,keyup等事件来出发事件改变数据层的数据。整个过程均通过函数调用完成。 先上一段代码

var elems = [document.getElementById('el'), document.getElementById('input')];复制代码

整体思路是先取到标签,然后把取到的标签放到一个数组里

var data = {    value: 'hello!'};复制代码

之后定义一个初始化的值数组data里面value的值为hello

var command = {        text: function(str){            this.innerHTML = str;        },        value: function(str){            this.setAttribute('value', str);        }};复制代码

text定义文本得内容 value输入的内容之后通过setAttribute() 方法给输入框添加指定的文本内容 定义完之后基础的部分也就做好了之后是需要进行逻辑的编写

var scan = function(){        /**         * 扫描带指令的节点属性         */        for(var i = 0, len = elems.length; i < len; i++){            var elem = elems[i];            elem.command = [];            for(var j = 0, len1 = elem.attributes.length; j < len1; j++){                var attr = elem.attributes[j];                if(attr.nodeName.indexOf('q-') >= 0){                    /**                     * 调用属性指令,这里可以使用数据改变检测                     */                    command[attr.nodeName.slice(2)].call(elem, data[attr.nodeValue]);                    elem.command.push(attr.nodeName.slice(2));                }            }        }    }复制代码

首先需要循环节点首先定义一个空数组elem.command = []用来存取改变的值, 之后需要循环获取指定字符首次出现的位置elem.attributes.length就是这个东西然后做判断调用指令,这里可以使用数据改变检测

command[attr.nodeName.slice(2)].call(elem, data[attr.nodeValue]); elem.command.push(attr.nodeName.slice(2));复制代码

之后可以设置扫描执行来改变视图的显示

function mvSet(key, value){       data[key] = value;       scan();}复制代码

然后通过数据绑定监听来实现数据的绑定效果

elems[1].addEventListener('keyup', function(e){       mvSet('value', e.target.value);}, false);复制代码

addEventListener方法用于向指定元素添加事件句柄

target可返回事件目标节点(触发该事件的节点),如生成事件的元素、文档或窗口。

最后一步就是设置时间来更新视图的显示

setTimeout(function(){        mvSet('value', data.value)},1000)复制代码

这里绑定了刚才上面设置的数组的值

下面帖一下整体的代码

复制代码

这样就做到了javascript的双向数据绑定,测试了一下绑定的数据还是不能改变的只能做到视图层的改变,之后我会进一步的研究双向绑定数据是如何改变的原理。

参考文章转自http://www.jb51.net/article/107917.html

如有解释上的错误还望各位提出来我会一一改正

经过3天的研究成果就是这么多因为本人是第一次发文章心里还是有点小紧张的希望各位多多包涵,谢谢。

转载于:https://juejin.im/post/5a76c079f265da4e8c44e0a9

你可能感兴趣的文章
python编码问题总结
查看>>
DateTimeUtil 工具类,android 和 java 通用
查看>>
Flipkart: 携手 Android Go 拥抱印度市场
查看>>
【模板】杜教筛(Sum)
查看>>
9月5 号作业管理信息系统
查看>>
a标签中有img有时候会把a撑过大
查看>>
数据库分库分表思路
查看>>
查看 FormData 中已存在的值
查看>>
shell浅谈之三for、while、until循环【转】
查看>>
嵌入式Linux下Camera编程--V4L2【转】
查看>>
算法(Algorithms)第4版 练习 1.3.25 1.3.24
查看>>
(三)Controller接口控制器详解(一)
查看>>
0328复利软件4.0测试
查看>>
git 回滚操作
查看>>
背包问题初探
查看>>
野生前端的数据结构基础练习(4)——字典
查看>>
***UML类图几种关系的总结
查看>>
【BZOJ 1056 1862】排名系统
查看>>
AI入门丨开源学习资源推荐
查看>>
观书有感(摘自12期CSDN)
查看>>