vue3.0响应式原理,vue2和vue3响应式的区别

  vue3.0响应式原理,vue2和vue3响应式的区别

  本文主要介绍Vue3响应原理的详细说明。文章通过对比vue2.x的响应,展示了Vue3响应原理的细节,感兴趣的朋友可以参考一下。

  

目录

  查看vue2.x和vue3的响应反映

  

回顾 vue2.x 的响应式

  实现原理:

  对象类型:通过object.defineProperty()(数据劫持)读取和修改属性的拦截数组类型:拦截是通过重写一系列方法来更新数组(包装数组的变化方法)Object.defineproperty (data, count ,{

  get(){},

  set(){}

  })

  存在问题:

  添加和删除属性,界面不会更新,直接用下标修改数组,界面不会自动更新。但是,vue2给出了解决方案。让我们看看下面的代码:

  模板

  差异

  H2我是vue2 /h2写的效果

  H4-show= person.name 姓名:{{person.name}}/h4

  H4年龄:{{person.age}}/h4

  H4-show= person.sex 性别:{{person.sex}}/h4

  H4爱好:{{person.hobby}}/h4

  按钮@click=addSex 添加性属性/按钮

  按钮@click=deleteName 删除名称属性/按钮

  按钮@click=changeHobby 修改爱好/按钮

  /div

  /模板

  脚本

  从“vue”导入Vue

  导出默认值{

  名称:“应用程序”,

  data(){

  返回{

  人:{

  姓名:张三,

  年龄:18,

  爱好:[学习,吃饭]

  }

  }

  },

  方法:{

  addSex(){

  //这样直接加是不行的。

  //this.person.sex= male

  这个。$set(this.person, sex , male )

  //Vue.set(this.person, sex , male )

  },

  deleteName(){

  //这样直接加是不行的。

  //删除this.person.name

  //这个。$delete(this.person, name )

  Vue.delete(this.person, name )

  },

  changeHobby(){

  //这样直接加是不行的。

  //this . person . hobby[0]= shopping

  //可以这样。

  这个。$set(this.person.hobby,0,购物)

  //或者

  //this.person.hobby.splice(0,1,购物)

  },

  }

  }

  /脚本

  我们可以用 js 模拟 vue2 的响应式:

  脚本

  //源数据

  let person={

  姓名:张三,

  年龄:18岁

  }

  设p={}

  //模拟vue2实现响应。

  Object.defineProperty(p, name ,{

  可配置:真,

  当有人读名字时调用Get() {//函数

  返回人员姓名

  },

  设置(v) {

  person.name=v

  console . log(‘有人修改了name属性,我发现了。我要更新界面了’));

  }

  })

  Object.defineProperty(p, age ,{

  Get() {//当有人读取年龄时调用

  返回person.age

  },

  设置(v) {

  person.age=v

  console . log(‘有人修改了年龄属性,我发现了。我要更新界面了’));

  }

  })

  /脚本

  先输出person,再看p,修改姓名或年龄时会被检测到。

  它的问题是,如果添加了性别属性,vue不会检测到它。虽然添加了性别属性,但它没有响应性,因为它有getter和setter,如name和age。

  同样,当名称属性被删除时,也无法对其进行监控。

  

vue3的响应式

  模板

  H1一个人的信息/h1

  H3-show= person . Name Name:{ { person . Name } }/H3

  H3: {{ person.age }}/h3

  H3-show= person.sex 性别:{{ person.sex }}/h3

  .

  Button @click=changeInfo 修改器的信息/button

  Button @click=addSex 添加性属性/button

  Button @click=deleteName 删除名称属性/按钮

  /模板

  脚本

  从“vue”导入{reactive}

  导出默认值{

  名称:“应用程序”,

  setup() {

  .

  函数changeInfo() {

  .

  Person.hobby[0]=学习

  }

  函数addSex() {

  Person.sex= male

  }

  函数deleteName() {

  删除人名

  }

  返回{

  .

  addSex,

  删除名称

  }

  }

  }

  /脚本

  模拟 vue3 中的响应式:

  脚本

  //源数据

  let person={

  姓名:张三,

  年龄:18岁

  }

  const p=新代理(person,{

  //当有人读取p的一个属性时调用。

  get(target,p,receiver) {

  Console.log(`有人读取了P `上的${p}属性);

  //返回目标[p]

  返回Reflect.get(target,p)

  },

  //当有人修改或添加p的属性时调用。

  集合(目标,p,值,接收者){

  Console.log(`有人修改了P上的${p},我去更新界面`);

  //target[p]=值

  Reflect.set(目标,p,值)

  },

  //当有人删除p的一个属性时调用。

  deleteProperty(target,p) {

  Console.log(`有人在P上删除了${p},我去更新界面`);

  //返回删除目标[p]

  返回Reflect.deleteProperty(target,p)

  }

  })

  /脚本

  实现原理:

  通过Proxy(代理)截取对象中任意属性的变化,包括读写属性值、添加属性、删除属性等。通过Reflect(反射):操作源对象MDN文档中描述的 Proxy 与 Reflect的属性

  Reflect是一个内置对象,它提供了拦截JavaScript操作的方法。Reflect不是函数对象,因此它是不可构造的。

  新代理(数据,{

  //截取读取属性值

  获取(目标,道具){

  返回Reflect.get(target,prop)

  },

  //拦截设置属性值或添加新属性

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

  返回Reflect.set(目标,属性,值)

  },

  //拦截删除属性

  deleteProperty(目标,属性){

  返回Reflect.deleteProperty(target,prop)

  }

  })

  proxy.name=tom

  关于Vue3响应原理的详细解释,本文到此为止。更多相关Vue3响应,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

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

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