Vue 3.0双向绑定原理的实现方式
时间:2021-12-14 17:29:42 栏目:百科资讯
【导读】:proxy方式
vue.js 是接纳数据挟制连系宣布者-订阅者模式的方式,通过new Proxy()来挟制各个属性的setter,getter,在数据更改时宣布新闻给订阅者,触发响应的监听回调。
...
vue.js 是接纳数据挟制连系宣布者-订阅者模式的方式,通过new Proxy()来挟制各个属性的setter,getter,在数据更改时宣布新闻给订阅者,触发响应的监听回调。
...
proxy方式
vue.js 是接纳数据挟制连系宣布者-订阅者模式的方式,通过new Proxy()来挟制各个属性的setter,getter,在数据更改时宣布新闻给订阅者,触发响应的监听回调。
Vue 3.0与Vue 2.0的区别仅是数据挟制的方式由Object.defineProperty更改为Proxy署理,其他代码稳固。可查看Vue 2.0双向绑定原理的实现
详细实现历程的代码如下:
1、界说组织函数
function Vue(option){ this.$el = document.querySelector(option.el); //获取挂载节点 this.$data = option.data; this.$methods = option.methods; this.deps = {}; //所有订阅者聚集 目的花样(一对多的关系):{msg: [订阅者1, 订阅者2, 订阅者3], info: [订阅者1, 订阅者2]} this.observer(this.$data); //挪用考察者 this.compile(this.$el); //挪用指令剖析器 }
2、界说指令剖析器
Vue.prototype.compile = function (el) { let nodes = el.children; //获取挂载节点的子节点 for (var i = 0; i < nodes.length; i ) { var node = nodes[i]; if (node.children.length) { this.compile(node) //递归获取子节点 } if (node.hasAttribute('l-model')) { //当子节点存在l-model指令 let attrVal = node.getAttribute('l-model'); //获取属性值 node.addEventListener('input', (() => { this.deps[attrVal].push(new Watcher(node, "value", this, attrVal)); //添加一个订阅者 let thisNode = node; return () => { this.$data[attrVal] = thisNode.value //更新数据层的数据 } })()) } if (node.hasAttribute('l-html')) { let attrVal = node.getAttribute('l-html'); //获取属性值 this.deps[attrVal].push(new Watcher(node, "innerHTML", this, attrVal)); //添加一个订阅者 } if (node.innerHTML.match(/{{([^{|}] )}}/)) { let attrVal = node.innerHTML.replace(/[{{|}}]/g, ''); //获取插值表达式内容 this.deps[attrVal].push(new Watcher(node, "innerHTML", this, attrVal)); //添加一个订阅者 } if (node.hasAttribute('l-on:click')) { let attrVal = node.getAttribute('l-on:click'); //获取事宜触发的方式名 node.addEventListener('click', this.$methods[attrVal].bind(this.$data)); //将this指向this.$data } } }
3、界说考察者(区别在这一块代码)
Liu.prototype.observer = function (data) { const that = this; for(var key in data){ that.deps[key] = []; //初始化所有订阅者工具{msg: [订阅者], info: []} } let handler = { get(target, property) { return target[property]; }, set(target, key, value) { let res = Reflect.set(target, key, value); var watchers = that.deps[key]; watchers.map(item => { item.update(); }); return res; } } this.$data = new Proxy(data, handler); }
4、界说订阅者
使用layui前端框架弹出form表单以及提交的示例,今天小编就为大家分享一篇使用layui前端框架弹出form表单以及提交的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧,使用layui前端框架弹出form表单以及提交的示例function Watcher(el, attr, vm, attrVal) { this.el = el; this.attr = attr; this.vm = vm; this.val = attrVal; this.update(); //更新视图 }
5、更新视图
Watcher.prototype.update = function () { this.el[this.attr] = this.vm.$data[this.val] }
以上代码界说在一个Vue.js文件中,在需要使用双向绑定的地方引入即可。
实验使用一下:
Document 点我{{msg}}
更多教程点击《Vue.js前端组件学习教程》,迎接人人学习阅读。
关于vue.js组件的教程,请人人点击专题vue.js组件学习教程举行学习。
以上就是本文的所有内容,希望对人人的学习有所辅助,也希望人人多多支持爱蒂网。
您可能感兴趣的文章:
- Vue 2.0双向绑定原理的实现方式
- 详解基于Vue的支持数据双向绑定的select组件
- 详解vue中的父子传值双向绑定及数据更新问题
- 详解vue的双向绑定原理及实现
- 自界说Vue中的v-module双向绑定的实现
- 解决VUE双向绑定失效的问题
版权声明:
1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。
2、本站仅提供信息发布平台,不承担相关法律责任。
3、若侵犯您的版权或隐私,请联系本站管理员删除。
4、、本文由会员转载自互联网,如果您是文章原创作者,请联系本站注明您的版权信息。