对于vue中数据响应式原理说法,vue的响应式原理和数据绑定

  对于vue中数据响应式原理说法,vue的响应式原理和数据绑定

  本文主要介绍vue数据响应的相关资料,有助于你更好的理解和学习Vue框架的使用。感兴趣的朋友可以了解一下。

  在谈数据响应之前,我们要解决一个很重要的问题,那就是Vue对数据做了什么?让我们从getter和setter开始。我们用它们来读写虚拟属性。

  

getter和setter

  有以下代码

  设obj0={

  姓氏:高,

  姓名:渊源,

  年龄:18岁

  };

  //需求一,获取名称

  设obj1={

  姓氏:高,

  姓名:渊源,

  Name () {

  归还这个。姓这个。名字;

  },

  年龄:18岁

  };

  Console.log(要求1: obj1。name());//高圆圆

  这个时候我们日志的结果是高圆圆,大家都可以理解,但是名字后面的括号可以删掉吗?不,因为它是一个函数,所以我们怎么去掉括号呢?这是我们的要求。

  //要求2,名称可以不带括号获取。

  设obj2={

  姓氏:高,

  姓名:渊源,

  Get name () {

  归还这个。姓这个。名字;

  },

  年龄:18岁

  };

  Console.log(要求2: obj2。姓名);//高圆圆

  此时我们使用getter,不用括号就可以得到值。那我们怎么改这个名字呢?

  //要求三:名字会写

  让obj3={

  姓氏:高,

  姓名:渊源,

  Get name () {

  归还这个。姓这个。名字;

  },

  集合名称(xxx){

  这个。姓氏=xxx[0]

  这个。name=xxx.slice(1)

  },

  年龄:18岁

  };

  Obj3。Name=高圆圆

  Console.log(`需求三:姓氏${obj3。姓氏},名字${obj3。名字} `)//高圆圆

  Get有set,setters就是这么用的。我们用属性值=xxx触发set函数,名字就可以写了。但是,如果我们在要求三中键入console.log(obj3 ),我们将得到下图:

  为什么这个名字: (.)出现如图?其实这是一个get set,浏览器打印出来的名字: (.)当它显示这个名称时。这说明我们可以读写需求3中的名称,但是没有名为name的属性,但是有get和set来模拟对名称的操作。

  

Object.defineProperty

  在上面的例子中,我们在定义对象的时候直接使用了get和set,但是如果对象已经被声明了,那么如何继续添加get呢?我们将使用Object.defineProperty或需求三。我们可以通过添加以下代码在定义后添加get和set:

  var _xxx=0

  Object.defineProperty(obj3, xxx ,{

  get(){

  return _xxx

  },

  设置(值){

  _xxx=值

  }

  })

  接下来,我们可以解决最初的问题:Vue对数据做了什么?让我们来看一些例子:

  让数据0={

  n: 0

  }

  首先声明一个数据0。需求1:用Object.defineProperty定义n:

  让数据1={}

  Object.defineProperty(数据1, n ,{

  值:0

  })

  Console.log(`要求一:${data1.n}`)//要求一:0

  二:n不能小于0:

  让数据2={}

  2._ n=0//_ n用于秘密存储n的值,默认为0。

  Object.defineProperty(data2, n ,{

  get(){

  归还这个。_n

  },

  设置(值){

  if(值0)返回

  这个。_n=值

  }

  })

  Console.log(`要求2: ${data2.n}`)//0

  data2.n=-1

  console . log(` Requirement 2:$ { data 2 . n }设置为-1时失败)//0设置为-1时失败。

  data2.n=1

  console . log(` Requirement 2:$ { data 2 . n }设置为1成功`)//0设置为1成功。

  但是如果对方直接用data2呢?_n?我们可以不公开任何可以在对象上访问的内容吗?这就是我们要使用代理的时候:

  let 3=proxy({ data:{ n:0 } })//括号中有一个匿名对象,无法访问。

  函数代理({data}){

  const obj={}

  //这里的‘n’写死了。理论上,数据的所有键都应该被遍历。这里简化一下。

  //因为我怕你听不懂。

  Object.defineProperty(obj, n ,{

  get(){

  返回数据. n

  },

  设置(值){

  if(值0)返回

  data.n=值

  }

  })

  返回obj //obj是代理

  }

  //数据3是对象

  Console.log(`要求三:$ {data3.n } `)

  数据3.n=-1

  Console.log(`要求三:${data3.n},设置为-1会失败`)

  data3.n=1

  Console.log(`要求三:${data3.n},设置为1成功`)

  但是如果你不想用代理,你该怎么办?

  让我的数据={n:0}

  let 4=proxy({ data:my data })//括号中有一个匿名对象,无法访问。

  //数据3是对象

  console . log(` level essence:$ { data 4 . n } `)//0

  myData.n=-1

  console . log(` level essence:$ { data 4 . n })未能将其设置为-1!`)

  这样现在还能更改myData,所以我们还有一个要求:即使用户未经授权修改myData,也要拦截:

  让我的数据5={n:0}

  let 5=proxy 2({ data:my data 5 })//括号是匿名对象,不能访问。

  函数代理2({data}){

  //这里的‘n’写死了。理论上,数据的所有键都应该被遍历。这里简化一下。

  value=data . n//保存起始n

  Object.define属性(data, n ,{//声明一个新的n

  get(){

  返回值

  },

  set(newValue){

  if(newValue0)返回

  值=新值

  }

  })

  只要加上上面的话,就会监测到数据。

  const obj={}

  Object.defineProperty(obj, n ,{

  get(){

  返回数据. n

  },

  设置(值){

  if(value0)return//这句话是多余的。

  data.n=值

  }

  })

  返回obj //obj是代理

  }

  //数据3是对象

  console . log(` demand five:$ { data 5 . n } `)//0

  我的数据5.n=-1

  Console.log(`要求五:${data5.n},设置为-1失败`)//0

  myData5.n=1

  Console.log(`要求五:${data5.n},设置为1成功`)//1

  当我们编写vm=new Vue({data:myData})时,Vue做两件事:

  让vm成为myData的代理,你可以通过这个访问vm。

  将监视myData的所有属性。为了防止myData的属性改变,vm不知道它。知道属性变化后,它可以调用render(data),UI可以自动刷新。

  然后我们可以回到标题。什么是数据响应性?如果一个物体能够对外界刺激做出反应,那么它就是有反应的。Vue的数据有响应,const VM=new Vue({ data:n:0 } })。在这段代码中,如果修改vm.n,那么UI中的N也会相应地更新。Vue通过Object.defineProperty实现数据响应。

  什么是响应式网页?也就是说,如果你改变了窗口的大小,网页的内容也会随之改变,那么这个网页就叫做响应式网页。

  以上是Vue数据响应性的详细总结。更多关于Vue数据响应的信息,请关注我们的其他相关文章!

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

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