vue-计算属性与侦听器

Posted peilin-liang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue-计算属性与侦听器相关的知识,希望对你有一定的参考价值。

今日分享

当在表达式中涉及复杂的运算的时候就可以用到计算属性——computed

基本用法:

<span>{{sum}}</span>

 

computed:{
      sum:{
          get:function(){
             return this.a + this.b 
          },
          set:function(newValue){
              window.console.log(newValue)
              console.log(‘setter‘)
              this.a+=10
          }
          
      }
  },

 

计算属性默认只有getter,可在必要的时候添加setter(注意:只有在设置fullName值的时候才会触发setter方法

// ...
computed: {
  fullName: {
    // getter 用来获取属性值。同时计算生成新的值。
    get: function () {
      return this.firstName + ‘ ‘ + this.lastName
    },
    // setter 用来改变传递过来的值,发生改变的时候,同时让数据的内容也发生改变。
    set: function (newValue) {
      var names = newValue.split(‘ ‘)
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}
<el-button type="danger" @click="fullName = ‘bob job‘">welcome</el-button>

计算属性缓存VS方法

不同的点在于计算属性是基于它们的响应式依赖进行缓存的。

只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 a,b还没有发生改变,多次访问 sum计算属性会立即返回之前的计算结果,而不必再次执行函数.

<template>
  <div class="hello">
        <el-row>
            <el-button type="danger" @click="sum += 1">welcome</el-button>
        </el-row>
        <el-row>
            <span>{{sum}}</span>
        </el-row>
        <el-row>
            <span>{{ add() }} </span>
        </el-row>
    
  </div>
</template>

<script>
export default {
  name: ‘HelloWorld‘,
  props: {
    msg: String
  },
  data(){
      return{
         a:1,
         b:2,
         sum1:0 
      }
          
  },
  computed:{
      sum:{
          get:function(){
             return this.a + this.b 
          },
          set:function(newValue){
              window.console.log(newValue)
              console.log(‘setter‘)
              this.a+=10
          }
          
      }
  },
  methods:{
      add:function(){
          return this.a +this.b
      }
  }
}
</script>

计算属性vs侦听属性

当需要在数据变化执行异步或开销较大的操作时,需要使用watch.

watch的基本用法: 当值发生变化时,watch监听并且执行

<template>
  <div class="hello">
        <el-row>
            <el-button type="danger" @click="sum += 1">welcome</el-button>
        </el-row>
        <el-row>
            <span>{{sum}}</span>
        </el-row>
  </div>
</template>

<script>
export default {
  name: ‘HelloWorld‘,
  props: {
    msg: String
  },
  data(){
      return{
         a:1,
         b:2,
         sum1:0 
      }
          
  },
  watch:{
      a(newValue,oldValue){
          console.log(‘a改变了‘)
      }
  },
  computed:{
      sum:{
          get:function(){
             return this.a + this.b 
          },
          
      }
  }
}
</script>

这样使用watch时会有存在一个问题:值第一次绑定的时候不会执行监听函数,只有值发生改变的时候才会执行。如果需要在绑定值得时候就触发函数的话,需要handlerimmediate属性。

watch:{
      a:{
          handler(newValue,oldValue){
          console.log(‘a改变了‘)
      },
      immediate:true
      }
  },

如果需要监听某个对象里面的属性值的变化,需要用到deep属性

watch:{
      a:{
          handler(newValue,oldValue){
          console.log(‘a改变了‘)
      },
      immediate:true,
      deep:true
      }
  },

但是这样使用会耗费很大的性能,可以简化:

data(){
      return{
         a:{
             value:1
         },
         b:2,
         sum1:0 
      }
          
  },
  watch:{
      "a.value":{
          handler(newValue,oldValue){
          console.log(‘a改变了‘)
      },
      immediate:true,
      //deep:true
      }
  },

 

 

以上是关于vue-计算属性与侦听器的主要内容,如果未能解决你的问题,请参考以下文章

Vue中的计算属性computed和侦听器watch

Vue中的计算属性computed和侦听器watch

Vue学习3:计算属性computed与监听器

vue-计算属性与侦听器

vue2计算属性(computed)与侦听器(watch)详解

Vue--》计算属性与监视(侦听)属性的使用