vue监听器和计算属性,vue监视属性

  vue监听器和计算属性,vue监视属性

  本文介绍了Vue中的计算属性和监控属性,并通过示例代码进行了详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。

  :

目录

   1.为什么要用计算属性?2.计算属性和方法的区别?1.差异?3.计算属性的使用场景?4.修改后的计算属性的值汇总?1.监控属性?2.监控属性和计算属性的区别?3.监控复杂物体。

  

一、为什么要使用计算属性

  

什么是计算属性

  计算属性:可以理解为一种属性,在其中可以编写一些计算逻辑。具有以下功能:

  减少模板中的计算逻辑。数据缓存。当我们的数据没有改变时,将不会再次执行计算过程。从属数据类型(响应数据)不能是普通的全局数据。当数据量较大时,计算属性可以帮助我们提高性能,因为计算属性只有在数据发生变化时才会被计算。

  在解释计算属性之前,让我们看一下下面的示例:

  需求:外卖套餐A在15元,顾客订了3份,总价打八折。送货费是5元。界面上需要显示总价,代码如下:

  模板

  差异

  Div您总共购买了{{info.name}}份副本/div。

  H1总价:{ { info . count * info . price * info . saleinfo . freight } }元/h1

  /div

  /模板

  脚本

  导出默认值{

  名称:“测试”,

  data(){

  返回{

  信息:{

  userId:1,

  价格:15,

  名称: A包,

  计数:3,

  销售额:0.8,

  运费:5英镑

  }

  }

  }

  }

  /脚本

  界面操作效果:

  看了上面的例子,可能有人会问:如果已经用这种方法实现了需求,为什么还需要使用计算属性呢?我们知道,vue中模板中的表达式是非常方便的,最初是为了简单操作而设计的。如果在模板中放入过多的逻辑会使模板过于沉重,难以维护,那么看看上面的代码:

  H1总价:{ { info . count * info . price * info . saleinfo . freight } }元/h1

  在这段代码中,模板不再是简单的声明性逻辑,而是复杂的逻辑计算。如果要参考多个地方的总价,就很难维持了。因此,对于任何复杂的逻辑,都应该使用计算属性。

  请看以下使用计算属性的示例:

  模板

  差异

  H1计算属性/h1

  Div您总共购买了{{info.name}}份副本/div。

  !-使用计算属性:与绑定普通属性相同-

  H1总价:{{totalPrice}}元/小时

  /div

  /模板

  脚本

  导出默认值{

  名称: ComputedDemo ,

  data(){

  返回{

  信息:{

  userId:1,

  价格:15,

  名称: A包,

  计数:3,

  销售额:0.8,

  运费:5英镑

  }

  }

  },

  计算值:{

  //定义计算属性totalPrice

  totalPrice:function(){

  return this . info . count * this . info . price * this . info . sale this . info . freight

  }

  }

  }

  /脚本

  界面显示效果:

  注意:计算属性是一个属性,而不是一个方法。它不能写在方法中,而是放在计算属性中。

  上述计算属性也可以写成ES6:

  //写入ES6

  总价格(){

  return this . info . count * this . info . price * this . info . sale this . info . freight

  }

  

二、计算属性和方法的区别

  

1、区别

  除了计算属性之外,还可以使用方法来实现上面的示例:

  模板

  差异

  H1计算属性/h1

  Div您总共购买了{{info.name}}份副本/div。

  !-使用计算属性:与绑定普通属性相同-

  H1使用计算属性得到总价:{{totalPrice}}元/h1

  使用h1方法得到总价:{{getTotalPrice()}}元/h1

  /div

  /模板

  脚本

  导出默认值{

  名称: ComputedDemo ,

  data(){

  返回{

  信息:{

  userId:1,

  价格:15,

  名称: A包,

  计数:3,

  销售额:0.8,

  运费:5英镑

  }

  }

  },

  计算值:{

  //定义计算属性totalPrice

  //totalPrice:function(){

  //返回this . info . count * this . info . price * this . info . sale this . info . freight;

  //}

  //写入ES6

  总价格(){

  返回this . info . count * this . info . price * this . info . sale this . info . freight;

  }

  },

  方法:{

  getTotalPrice(){

  返回this . info . count * this . info . price * this . info . sale this . info . freight;

  }

  }

  }

  /脚本

  界面显示效果:

  从上面的例子可以看出,计算属性和方法的最终效果是一样的。那么计算属性和方法有什么区别呢?属性基于它们的响应依赖关系被缓存,并且仅当响应依赖关系改变时才被重新评估。这意味着,只要响应依赖关系没有改变,对计算属性的多次访问将立即返回先前的计算结果,而不必再次执行计算。相反,调用方法总是会再次执行函数。总价属性和方法的区别如下:

  依赖关系改变时,计算属性自动改变,而依赖关系改变时,需要触发方法改变。当依赖项更改时,会重新计算属性,并且每次调用方法时都会执行该方法。请看下面的例子:

  模板

  差异

  H1计算属性/h1

  !- div您总共购买了{{info.name}}份{{info.count}}的/div-

  !-使用计算属性:与绑定普通属性相同-

  您购买了输入type= text v-model= info . name /

  数量输入类型= text v-model= info.count/

  H1使用计算属性得到总价:{{totalPrice}}元/h1

  Button @click=getTotalPrice 计算属性/button

  H1用该方法得到的总价为:{{data}}元/h1

  /div

  /模板

  脚本

  导出默认值{

  名称: ComputedDemo ,

  data(){

  返回{

  信息:{

  userId:1,

  价格:15,

  名称: A包,

  计数:3,

  销售额:0.8,

  运费:5英镑

  },

  数据:0

  }

  },

  计算值:{

  //定义计算属性totalPrice

  //totalPrice:function(){

  //返回this . info . count * this . info . price * this . info . sale this . info . freight;

  //}

  //写入ES6

  总价格(){

  Console.log(计算属性);

  返回this . info . count * this . info . price * this . info . sale this . info . freight;

  }

  },

  方法:{

  getTotalPrice(){

  Console.log(“方法”);

  this . data=this . info . count * this . info . price * this . info . sale this . info . freight;

  }

  }

  }

  /脚本

  当依赖关系改变时,会多次打印“计算属性”,直到点击按钮,方法才会改变。在依赖关系不变的情况下点击按钮,也会打印出“方法”。如下图所示:

  

2、计算属性使用场景

  如果我们有一个高性能代价的计算属性A,它需要遍历一个巨大的数组,做大量的计算,然后我们可能会有其他依赖于计算属性A的计算属性,如果你不使用计算属性,它必然会被计算很多次,会消耗很多性能。在这种情况下,您需要使用计算属性。

  

三、修改计算属性的值

  在上面的例子中,计算属性的值是通过使用获得的,那么如何修改计算属性的值呢?请看下面的例子:

  模板

  差异

  H1修改计算属性/h1

  h2num:{{num}}/h2

  H2计算属性num2:{{num2}}/h2

  Button @click=change 更改计算属性/按钮的值

  /div

  /模板

  脚本

  导出默认值{

  名称: ComputedDemo2 ,

  data(){

  返回{

  数量:100

  }

  },

  计算值:{

  num2(){

  返回this . num-10;

  }

  },

  方法:{

  更改(){

  this.num2=60

  }

  }

  }

  /脚本

  效果:

  这时你会发现,直接修改计算属性的值会给出一个错误,因为你不能直接修改计算属性的值。如果要修改计算属性的值,需要修改其依赖项的值。请参见以下代码:

  模板

  差异

  H1修改计算属性/h1

  h2num:{{num}}/h2

  H2计算属性num2:{{num2}}/h2

  Button @click=change 更改计算属性/按钮的值

  /div

  /模板

  脚本

  从“http”导入{ get };

  导出默认值{

  名称: ComputedDemo2 ,

  data(){

  返回{

  数量:100

  }

  },

  计算值:{

  num2:{

  //当要修改计算属性时,首先触发set方法。

  //读取当前计算属性中的值。get方法可以隐藏,默认条目是get方法。

  get:function(){

  返回this . num-10;

  },

  集合:函数(val){

  this.num=val

  }

  }

  },

  方法:{

  更改(){

  //不能直接修改计算属性。

  this.num2=60

  }

  }

  }

  /脚本

  修改前的效果:

  修改后的效果:

  

总结

  不能修改计算属性的值。如果要修改计算属性的值,必须通过计算属性中的set方法修改其依赖项的值。

  

四、监听属性

  监控属性(watch)用于监控数据中的数据是否发生变化,通常是监控数据中的某个属性。

  一个更加灵活和通用的API。Watch可以执行任何逻辑,比如函数节流、Ajax异步数据获取,甚至DOM操作。

  

1、监听普通属性

  请看下面的代码:

  模板

  差异

  H1监听属性/h1

  name:input type= text v-model= username /

  h1 { {用户名}}/h1

  年龄:输入类型=text v-model=age/

  h1 { {年龄}}/h1

  /div

  /模板

  脚本

  导出默认值{

  名称:观看演示,

  data(){

  返回{

  用户名:“abc”,

  年龄:23岁

  }

  },

  方法:{

  更改(){

  }

  },

  观察:{

  //侦听用户名的更改

  //有两个参数,newValue表示更改后的值,oldValue表示更改前的值。

  用户名:函数(新值,旧值){

  Console.log(修改前值: old value );

  Console.log(修改值: new value );

  },

  //倾听年龄的变化

  年龄:函数(新值,旧值){

  Console.log(修改前值: old value );

  Console.log(修改值: new value );

  }

  }

  }

  /脚本

  界面效果:

  

2、监听属性和计算属性的区别

  监视属性和计算属性之间的主要区别如下:

  属性表现更好。一个监控属性只能监控一个属性的变化。如果要同时监控多个属性,就要写多个监控属性,而计算属性可以同时监控多个数据的变化。侦听属性以获取更改前的属性值。属性能做什么,手表就能做什么,反之亦然。您可以使用计算属性。尽可能使用计算属性。

  要求:当用户名或年龄改变时,打印出当前的用户名和年龄值。

  用监听属性实现:

  模板

  差异

  H1监听属性/h1

  name:input type= text v-model= username /

  h1 { {用户名}}/h1

  年龄:输入类型=text v-model=age/

  h1 { {年龄}}/h1

  !-打印用户名和年龄的值-

  h1{{info}}/h1

  /div

  /模板

  脚本

  导出默认值{

  名称:观看演示,

  data(){

  返回{

  用户名:“abc”,

  年龄:23,

  信息:“”

  }

  },

  方法:{

  更改(){

  }

  },

  观察:{

  //侦听用户名的更改

  //有两个参数,newValue表示更改后的值,oldValue表示更改前的值。

  用户名:函数(新值,旧值){

  //console.log(修改前的值: old value );

  //console . log( modified value: new value );

  This.info=我的名字: this.userName ,年龄: this . age ;

  },

  //倾听年龄的变化

  年龄:函数(新值,旧值){

  //console.log(修改前的值:旧值);

  //console.log(修改后的值:新值);

  this.info=我的姓名:这个用户名,年龄:“this.age

  }

  }

  }

  /脚本

  如果要实现上述的需求,则需要对用户名和年龄都进行监听,监听属性里面的代码都是重复的,如果有多个,那么就要写多个监听属性。在看计算属性:

  模板

  差异

  氕监听属性/h1

  姓名:输入类型=text v-model=userName/

  h1 { {用户名}}/h1

  年龄:input type=text v-model=age/

  h1 { {年龄}}/h1

  !-打印用户名和年龄的值-

  !- h1{{info}}/h1 -

  !-使用计算属性-

  h1{{getUserInfo}}/h1

  /div

  /模板

  脚本

  导出默认值{

  名称:观看演示,

  data(){

  返回{

  用户名:“abc”,

  年龄:23,

  信息:""

  }

  },

  方法:{

  更改(){

  }

  },

  //观察:{

  ////监听用户名的变化

  ////有两个参数,新值表示变化后的值,旧值表示变化前的值

  //userName:function(newValue,oldValue){

  ////console.log(修改前的值:旧值);

  ////console.log(修改后的值:新值);

  //this.info=我的姓名:这个用户名,年龄:“this.age

  //},

  ////监听年龄的变化

  //age:function(newValue,oldValue){

  ////console.log(修改前的值:旧值);

  ////console.log(修改后的值:新值);

  //this.info=我的姓名:这个用户名,年龄:“this.age

  //}

  //}

  计算值:{

  getUserInfo(){

  返回我的姓名:这个用户名,年龄:“this.age

  }

  }

  }

  /脚本

  如果使用计算属性则只需要写一次就可以实现上面的需求了。

  

3、监听复杂对象

  上面的例子中是监听的普通属性,那么如何监听对象里面的属性呢?看下面的代码:

  模板

  差异

  氕监听属性/h1

  姓名:输入类型=text v-model=userName/

  h1 { {用户名}}/h1

  年龄:input type=text v-model=age/

  h1 { {年龄}}/h1

  !-打印用户名和年龄的值-

  !- h1{{info}}/h1 -

  !-使用计算属性-

  h1{{getUserInfo}}/h1

  !-监听对象属性-

  氕监听对象属性/h1

  姓名:输入类型= text v-model= obj。名称/

  h1{{obj.name}}/h1

  /div

  /模板

  脚本

  导出默认值{

  名称:观看演示,

  data(){

  返回{

  用户名:“abc”,

  年龄:23,

  信息:,

  //对象

  目标

  名称:"123"

  }

  }

  },

  方法:{

  更改(){

  }

  },

  观察:{

  //监听用户名的变化

  //有两个参数,新值表示变化后的值,旧值表示变化前的值

  用户名:函数(新值,旧值){

  //console.log(修改前的值:旧值);

  //console.log(修改后的值:新值);

  this.info=我的姓名:这个用户名,年龄:“this.age

  },

  //监听年龄的变化

  年龄:函数(新值,旧值){

  //console.log(修改前的值:旧值);

  //console.log(修改后的值:新值);

  this.info=我的姓名:这个用户名,年龄:“this.age

  },

  //监听对象中属性的变化

   obj.name:function(newValue,oldValue){

  console.log(修改前的值:旧值);

  console.log(修改后的值:新值);

  }

  },

  计算值:{

  getUserInfo(){

  返回我的姓名:这个用户名,年龄:“this.age

  }

  }

  }

  /脚本

  效果:

  能不能执行监听对象呢?答案是可以的,看下面代码:

  模板

  差异

  氕监听属性/h1

  姓名:输入类型=text v-model=userName/

  h1 { {用户名}}/h1

  年龄:input type=text v-model=age/

  h1 { {年龄}}/h1

  !-打印用户名和年龄的值-

  !- h1{{info}}/h1 -

  !-使用计算属性-

  h1{{getUserInfo}}/h1

  !-监听对象属性-

  氕监听对象属性/h1

  姓名:输入类型= text v-model= obj。名称/

  h1{{obj.name}}/h1

  !-监听对象-

  氕监听对象/h1

  姓名:输入类型= text v-model= obj。名称/

  h1{{obj.name}}/h1

  /div

  /模板

  脚本

  导出默认值{

  名称:观看演示,

  data(){

  返回{

  用户名:“abc”,

  年龄:23,

  信息:,

  //对象

  目标

  名称:"123"

  }

  }

  },

  方法:{

  更改(){

  }

  },

  观察:{

  //监听用户名的变化

  //有两个参数,新值表示变化后的值,旧值表示变化前的值

  用户名:函数(新值,旧值){

  //console.log(修改前的值:旧值);

  //console.log(修改后的值:新值);

  this.info=我的姓名:这个用户名,年龄:“this.age

  },

  //监听年龄的变化

  年龄:函数(新值,旧值){

  //console.log(修改前的值:旧值);

  //console.log(修改后的值:新值);

  this.info=我的姓名:这个用户名,年龄:“this.age

  },

  //监听对象中属性的变化

  //obj.name:function(newValue,oldValue){

  //console.log(修改前的值:旧值);

  //console.log(修改后的值:新值);

  //}

  //直接监听对象

  目标

  //处理程序表示默认执行的函数

  处理程序(新值,旧值){

  console.log(修改前的值:)

  console.log(旧值);

  console.log(修改后的值:);

  控制台。log(新值);

  },

  //表示深度监听

  //真:表示处理者函数会执行

  //false:表示处理者函数不会执行

  深:真的

  }

  },

  计算值:{

  getUserInfo(){

  返回我的姓名:这个用户名,年龄:“this.age

  }

  }

  }

  /脚本

  效果:

  开源代码库代码地址:https://github。/江1988/计算机。饭桶

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

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

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