• 分类目录: 200 个;
  • 标签: 10638 个;
  • 资讯: 7253 篇;(待审:221 篇);
  • 网站: 11270 个 (待审:155个);
  • 评论: 8 个 (待审:1 个) ;
  • 今日审核: 0 个 (待审:1 个) ;

Vue 3.0双向绑定原理的实现方式

时间:2021-12-14 17:29:42 栏目:百科资讯
【导读】:proxy方式
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、、本文由会员转载自互联网,如果您是文章原创作者,请联系本站注明您的版权信息。