vue2.0响应式原理,vue.js响应式原理

  vue2.0响应式原理,vue.js响应式原理

  应用会对用户的操作进行反馈,这叫做响应性。数据变化会实时改变UI,这叫做数据响应性。当Vue实例中的数据被修改时,视图会被重新渲染,这叫做Vue的数据响应性。

  

目录

  什么是响应式?如何实现数据响应?对象属性拦截?一般劫持方案概述

  

响应式是什么

  简而言之,数据改变,页面改变。

  

如何实现数据响应式

  Javascript中实现数据响应一般有两种方案,分别对应vue2.x和vue3.x使用的方式。它们是:

  属性拦截(vue2.x)

  对象.定义属性

  对象整体代理(vue3.x)

  代理人

  其中,对象属性拦截也有同样的道理。

  

实现对象属性拦截

  文字对象定义

  let data={

  姓名:小蓝同学

  }

  object . define属性对象定义

  让数据={}

  Object.defineProperty(data, name ,{

  //访问name属性执行此方法,返回值为获取的值。

  get(){

  Console.log(“获得了名称属性”)

  返回“小蓝同学”

  },

  //设置新值将执行此方法。newVal是设置的新值

  set(newVal){

  Console.log(name name属性已设置为新值)

  console.log(newVal)

  }

  })

  我们可以通过data.name获取值,也可以通过data.name=同学小昭赋值

  存在问题演示

  最后,获得名称值不变。

  解决办法

  我们可以通过一个中间变量_name来传递get函数和set函数之间的联动。

  让数据={}

  Let _name=小蓝同学

  Object.defineProperty(data, name ,{

  //访问name属性执行此方法,返回值为获取的值。

  get(){

  Console.log(“获得了名称属性”)

  返回名称

  },

  //设置新值将执行此方法。newVal是设置的新值

  set(newVal){

  Console.log(name name属性已设置为新值)

  console.log(newVal)

  _name=newVal

  }

  })

  结果验证

  

通用的劫持方案

  想想吧。如果有一个对象的数据已经被声明了,那么如何将每个属性劫持成setter和getter的形式呢?

  下面是一个已经申报的数据。

  let data={

  姓名:小蓝同学,

  年龄:18,

  身高:180

  }

  我们希望其中的所有属性都是响应性的,get和set方法中每个属性值的操作都是相连的。

  let data={

  姓名:小蓝同学,

  年龄:18,

  身高:180

  }

  //遍历每个属性

  Object.keys(数据)。forEach((key)={

  //键属性名

  //数据[键]属性值

  defineReactive(数据,键,数据[键])

  })

  //响应转换方法

  函数定义有效(数据,键,值){

  Object.defineProperty(数据,键,{

  get(){

  返回值

  },

  set(newVal){

  值=新值

  }

  })

  }

  描述:这个地方实际上使用了闭包的特性。看下图。每次执行defineReactive函数,都会形成一个独立的函数作用域。由于闭包的原因,传入的值将驻留在内存中,因此每个defineReactive函数中的值将用作各自set和get函数的局部变量。

  

总结

  所谓响应式拦截,其实就是拦截对象属性的访问和设置。在Javascript中,有两种方法可以通过插入我们想要做的事情来实现响应拦截。Object.defineProperty方法和proxy对象Proxy返回到vue2.x中的数据配置项,只要放入data中的数据,不管层次结构有多深,不管你最终是否会用到这个数据,都会进行递归响应处理,所以要求我们在没有必要的情况下尽量不要添加过多的冗余数据。在数据方面,我们需要知道vue3.x,它解决了2中数据响应处理无端的性能消耗。使用手段是代理劫持整个对象使其惰性化(只有在使用后,才会以有反应的方式转化)。关于Vue对数据响应性原理的深入解释的这篇文章就介绍到这里。有关Vue数据响应能力的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

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

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