proxy vue双向绑定,vue3.0双向数据绑定原理

  proxy vue双向绑定,vue3.0双向数据绑定原理

  本文主要介绍通过代理实现vue3数据双向绑定的原理。文章首先介绍了代理的优势,重点介绍了通过代理实现vue3数据双向绑定的相关信息。有需要的朋友可以参考一下。

  :

目录

   1.代理相对于Object.defineProperty 2的优势。代理监控对象1的简单实现。代理对象2的简单实现。补充知识反射3 .代理方法3。手写vue3.0双向绑定——es6 proxy 1,什么是Proxy2,vue.js中的双向绑定

  四。代理与对象。定义属性

  

一、proxy对比Object.defineProperty的优点

  proxy的优点:

  代理可以直接监听对象而不是属性;

  代理可以直接监控数组的变化;

  Proxy最多有13种拦截方式,不限于apply、ownKeys、deleteProperty、has等。这些在Object.defineProperty中不可用。

  代理返回一个新对象,我们只能操作新对象达到目的,而Object.defineProperty只能遍历对象属性,直接修改;

  代理作为新标准,会被浏览器厂商不断优化,也就是传说中新标准的性能加成;

  Object.defineProperty 的优势:

  兼容性好:支持IE9,但是代理有浏览器兼容问题,用polyfill无法平滑。所以Vue的作者声明,需要等到下一个大版本(3.0)才能用代理重写。

  

二、、proxy监听对象的简单实现

  

1.代理对象简单实现

  ` ` javascript

  let data={ };//定义一个空对象

  let proxy=new Proxy(data,{ });//以数据作为目标对象创建代理

  //修改代理对象的名称属性

  proxy.name= shelley

  console.log(代理);

  console.log(数据)

  //{姓名:谢莉 }

  //{姓名:谢莉 }

  ```

  

2.补充知识 Reflect

  反射对象和代理对象一样,是ES6为操作对象提供的新API。

  我们需要在handler.set()中返回一个Reflect.set(…arguments)来分配给目标对象。

  Reflect.set方法将目标对象的name属性设置为value。如果name属性设置了一个赋值函数,那么这个赋值函数将绑定到接收控件。

  Reflect.get方法查找并返回目标对象的name属性,如果没有该属性,则返回undefined。

  

3.proxy方法

  handler.set()方法 属性设置操作的捕捉器。

  ` ` javascript

  let data={

  名字:“谢莉”,

  年龄:“27岁”

  };

  设p=新代理(数据,{

  设置(目标,属性,值){

  //target=目标对象

  //prop=设置属性

  //value=修改后的值

  console.log(目标,属性,值);//{姓名: 谢莉,年龄: 27 } 18岁

  返回Reflect.set(.论据);

  }

  })

  p.age=18

  console.log(数据);//{姓名:“谢莉”,年龄:18岁}

  ```

  - handler.get() 属性读取操作的捕捉器。

  ` ` javascript

  let data={

  名字:“谢莉”,

  年龄:22岁

  };

  设p=新代理(数据,{

  获取(目标,道具){

  console.log(目标,道具);//{姓名:“谢莉”,年龄:22岁

  返回Reflect.get(.论据);

  }

  })

  console . log(p . age);//22

  ```

  Object.defineProperty监听对象的简单实现

  ` ` javascript

  var o={ };//创建一个新对象

  var bValue=39//添加一个在对象中设置了访问描述符属性的示例

  Object.defineProperty(o, bValue ,{

  //这段代码不会设置O的属性,只有在访问

  get() {

  返回bValue

  },

  set(newValue) {

  console.log(set==,new value);

  bValue=newValue

  }

  });

  console.log(o) //{}

  //进入访问器代理的bValue属性的get方法,返回,将O对象中bValue的值设置为38。

  console . log(o . b value);//38

  //进入访问器代理的bValue属性的set方法,设置bValue的新值,

  //返回获取并将O对象中bValue的值设置为40。

  o.bValue=40

  console.log(o.bValue) //40

  ```

  小结:

  与es5 Object.defineProperty相比,esproxy代理更加强大,提供了很多方法,甚至可以代理方法。

  为什么Vue在3.0中只用了es6的代理,而在2.0中没有?因为es6在某些浏览器中不兼容,比如ie的较低版本,所以只有* *大部分主流浏览器兼容* *时才使用。

  

三、手写vue3.0双向绑定-es6 Proxy

  

1、什么是Proxy

  就拿它的英文意思“代理”来说吧。所谓的代理,就是你想要获得某样东西或者对它进行某种操作的中间媒介,而不是直接作用于这个对象。

  代理可以理解为在目标对象前面设置一个拦截层,外界必须通过它先拦截对象,所以它提供了一种拦截或过滤外界访问的机制。

  

2、vue.js中使用双向绑定

  ` ` javascript

  div id=应用程序

  h2{{msg}}/h2

  输入类型=text v-model=msg/

  /div

  script src= https://cdn . jsdelivr . net/NPM/vue/dist/vue . js /script

  脚本

  让vm=new Vue({

  埃尔: #app ,

  数据:{

  味精:“雪莱”

  },

  })

  /脚本

  ```

  

四、Proxy对比Object.defineProperty

  Vue2.0中的双向绑定,使用Object.defineProperty()进行双向绑定

  缺点:

  无法监控数组,数组的方法被重写(push、pop、shift、unshift等。).对此执行双向绑定和数据监控。

  效率差,这主要是由于多层数据的一次性递归操作。如果有很多或者很深的数据,性能就很差。

  由于限制,无法监控新增/删除的数据,所以在vue2.0中使用$set手动添加。

  -Object.definePorperty()递归遍历所有对象的所有属性,当数据级别较深时会造成性能影响。

  -Object.definePorperty()只能作用于对象,不能作用于数组。

  -object . definerporty()只能监听已定义的属性,不能监听新添加的属性。

  -由于Object.definePorperty()不能作用于数组,vue2.0选择通过重写数组方法的原型来监控数组数据,但仍然无法监控数组索引和长度的变化。

  Vue3.0中双向绑定,使用Proxy和Reflect进行双向绑定

  优点:

  代理可以拦截和监听数组和对象。

  缺点:

  代理将发送多个set/get响应。

  解决办法:

  使用类似于去抖的操作进行优化,使其值响应一次。

  ((vue 3.0)中的解法,判断key是否为目标自身属性,value是否等于target[key]可以避免多余的set/get操作。

  Proxy只能代理一层,无法深度监听

  使用深度递归监控每一层。巧妙的使用Reflect.get()会返回一个对象(下一层)的内部结构特征,判断下一层是否还是对象,使用深度递归运算。但是对性能影响很大。

  使用weakMap,两个weak map用于保存原始数据和响应数据。当数据被访问时,如果它没有被再次代理,它将从保存的数据中被搜索。

  关于vue3数据通过代理双向绑定的原理,本文到此为止。关于vue3数据通过代理双向绑定的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: