对于vue中数据响应式原理说法,vuex里面的数据是响应式的吗

  对于vue中数据响应式原理说法,vuex里面的数据是响应式的吗

  Vue.js的核心包括一个“响应式系统”。“响应式”是指当数据发生变化时,Vue会通知使用数据的代码。例如,当在视图渲染中使用数据时,当数据改变时,视图将自动更新。

  :

目录

   1.es语法的getter和setter2的Define属性。ES语法3。VUE的代理和数据监控4。Vue的数据响应

  

1. ES语法的getter和setter

  在开始了解Vue的数据响应原理之前,我们首先要知道ES语法中getter和setter方法的具体用法。

  Getter和setter方法是用get和set关键字向对象添加虚拟属性的一种方式。这种属性其实并不存在,是getter和setter模拟出来的一种属性。目的是为属性设置一个值函数和一个值函数,拦截属性的访问行为,从而对属性的访问做出一些限制。如下所示(以下代码来自mdn)

  吸气方法

  const obj={

  日志:[a , b , c],

  Get latest() {//在普通方法之前添加Get关键字

  if (this.log.length==0) {

  返回未定义的;

  }

  返回this . log[this . log . length-1];

  }

  }

  console . log(obj . latest);//输出C,得到不带括号的属性名。

  Setter方法

  常量语言={

  设置当前(名称){

  this.log.push(名称);

  },

  日志:[]

  }

  language.current= EN

  language.current= FA

  console . log(language . log);//输出数组[EN , FA]

  

2. ES语法的 defineProperty

  defineProperty方法直接在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回这个对象,它可以用来在对象被定义后修改或添加属性。

  语法是:

  Object.defineProperty(对象,属性,描述符)

  添加常规属性:

  let data={

  男:0

  }

  Object.defineProperty(data, n ,{

  Value: 1 //添加属性的值就是它的值

  })

  Console.log(`${data.n}`) //则n的输出值为1

  它还可以用来添加getter和setter的虚拟属性。

  让数据1={

  _n: 0

  }

  Object.defineProperty(数据1, n ,{

  get(){

  归还这个。_n

  },

  设置(值){

  if(值0)返回

  这个。_n=值

  }//直接声明get/set即可。

  })//因为表示虚属性为N,即get n(){},set n(value){},所以在定义函数时不需要写N。

  

3. Vue对数据的代理和监听

  代理,就是简单来说,我自己的一些事情我不亲自处理,而是交给别人帮我处理,而那个做事的人就是代理人。这个逻辑中有两个关键点需要明确。代理人是处理操作的人,他处理操作的东西不属于他,而属于委托他代理的人。

  所以相对于Vue数据代理,data {0}数据对象是委托给代理的,它找到的代理是Vue实例vm。data {0} data object要为vm做的是管理data {0} data object中的数据操作。所以data{}数据对象只负责内部数据的产生,产生的数据的管理和操作完全交给vm。

  那么vm如何控制和操作data{}数据对象中的数据呢?换句话说,当data{}数据对象中的任何属性值改变时,vm如何及时知道?

  因此,使用ES语法中的getter和setter方法。getter和setter方法控制的属性的任何操作都会被这两个函数检测到,而getter和setter方法形成的属性都是虚属性,是不存在的。所以,如果一个用户想在没有代理vm的情况下直接修改data{} data object的属性,并且无法获取对应的实体属性,那么只能通过getter和setter方法进行修改,所以它的修改会被vm检测到。

  因此,为了完全控制data{}数据对象中的数据,在创建Vue实例时,vm必须对传入的data{}数据对象进行一些处理。处理是将data{}数据对象中的属性改为由getter和setter方法控制的虚拟属性,保存在代理数据对象obj中并返回。

  但是,为了防止用户直接修改原始数据{0}属性,原始数据{0}对象的物理属性已经全部更改。如果添加的虚拟属性名称与物理属性名称相同,则原来的实际属性将被虚拟属性覆盖。用户的修改属性值是由getter和setter方法修改的虚拟属性。这样,数据对象的所有属性的任何改变都将被Vue实例vm检测到。

  让我的数据={n:0}

  let=proxy({ data:my data })//类似于let vm=new Vue({data: myData})

  函数代理({data}/*解构赋值*/) {

  let _n=data.n

  Object.define属性(data, n ,{//覆盖原来的data.n属性

  get(){

  return _n

  },

  set(newValue){

  if(newValue0)返回

  _n=新值

  }

  })//改变data{}数据对象本身的属性,通过闭包可以形成上下文,这样原来的实际属性值就存在于闭包的context _n中。

  const obj={}

  Object.defineProperty(obj, n ,{

  get(){

  返回数据. n

  },

  设置(值){

  data.n=值

  }

  })//为data{}数据对象添加一个代理来操作data{}数据对象。

  Return obj //obj是数据{}的代理

  }

  

4. Vue的数据响应式

  所谓应对,就是当事情发生变化时,会做出相应的反应。

  Vue中的数据data有响应。上面提到的Vue使用getter和setter方法,通过Object.defineProperty()函数代理和监控数据。一旦数据发生变化,Vue就会改变数据对应的UI视图,这就是Vue的数据响应性。

  但是当Vue使用Object.defineProperty设置监控时,只能对Vue实例化时已经存在于数据对象中的属性设置监控,而不能对不存在或后来添加的属性设置监控。

  要解决这个问题,有两种方法:

  1.提前声明所有属性。

  2.使用Vue.set和this。$set用于添加属性

  用Vue.set和this添加属性。$set将通知Vue为在此之后添加的属性设置监听操作。

  Vue.set(this.data , m , 10 )

  这个。$ set (this。data , m , 10 )//为vm的数据对象添加一个属性。m的值是10

  3.阵列变化

  对于数组数据的增加,无法控制新数据的数量,所以无法提前声明所有的数据值,一个一个设置太麻烦,而数组是常用的对象数据类型之一。所以vue的作者篡改了push、pop等添加、删除数组的功能。用户在vue中添加和删除数组时仍然使用push和pop,但是额外的处理是在内部完成的。这些被篡改的API会将数据代理添加到数组中,并根据数据响应改变UI视图。

  以上是对Vue的数据响应的详细了解。更多关于Vue的数据响应,请关注我们的其他相关文章!

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

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