{{ fullName }}
当前位置:   article > 正文

vue中computed以及getter和setter_vue computed getter setter

vue computed getter setter

vue中computed以及getter和setter


Vue 中,computed 的属性可以被视为是 data 一样,可以读取和设值。
因此在 computed 中可以分成 getter(读取) 和 setter(设值),
一般情况下是没有 setter 的,computed 预设只有 getter ,也就是只能读取,不能改变设值。

vue.js计算属性默认只有 getter,因为是默认值所以我们也常常省略不写,如下代码:

<div id="demo">{{ fullName }}</div>
var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在computed里的代码完整的写法应该是:

computed: {
   fullName: {
     get(){
        return this.firstName + ' ' + this.lastName
     }
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

计算属性getter的触发时间:

<template>
  <div id="demo">
       <p> {{ fullName }} </p>
       <input type="text" v-model="firstName">
       <input type="text" v-model="lastName">
  </div>
</template>

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'zhang',
    lastName: 'san'
  },
  computed: {
    fullName: function () {
      console.log('computed getter...')
      return this.firstName + ' ' + this.lastName
    }
  },
  updated () {
     console.log('updated')
  }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

如果我们改变上边代码里的两个输入框的值firstName或者lastName,都会触发computed以及updated (),也就是说会执行: console.log(‘computed getter…’)和console.log(‘updated’) (用来验证是不是执行了,没有其他意思)

需要注意的是,不是说我们更改了getter里使用的变量,就会触发computed的更新,前提是computed里的值必须要在模板里使用才行。怎么理解呢?

如下代码,我们把template里的fullName 注释掉:

<template>
    <div id="demo">
         <!-- <p> {{ fullName }} </p> -->
         <input type="text" v-model="firstName">
         <input type="text" v-model="lastName">
    </div>
</template>

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'zhang',
    lastName: 'san'
  },
  computed: {
    fullName: function () {
      console.log('computed getter...')
      return this.firstName + ' ' + this.lastName
    }
  },
  updated () {
     console.log('updated')
  }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

就算我们更改了firstName以及lastName都不会触发computed 中的 getter 中的console.log(‘computed getter…’),而只会触发console.log(‘updated’)

计算属性settter

<template>
    <div id="demo">
         <p> {{ fullName }} </p>
         <input type="text" v-model="fullName">
         <input type="text" v-model="firstName">
         <input type="text" v-model="lastName">
    </div>
</template>

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'zhang',
    lastName: 'san'
  },
  computed: {
    fullName: {
      //getter 方法
        get(){
            console.log('computed getter...')
            return this.firstName + ' ' + this.lastName
        },
   //setter 方法
        set(newValue){
            console.log('computed setter...')
            var names = newValue.split(' ')
            this.firstName = names[0]
            this.lastName = names[names.length - 1]
            return this.firstName + ' ' + this.lastName
        }
      
    }
  },
  updated () {
     console.log('updated')
  }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

在template 中,我们可以看到,input 是直接绑 v-model=“fullName”,如果我们这里直接修改了fullName的值,那么就会触发setter,同时也会触发getter以及updated函数。其执行顺序是setter -> getter -> updated,如下:

console.log('computed setter...')
console.log('computed getter...')
console.log('updated')
  • 1
  • 2
  • 3

这里需要注意的是,并不是触发了setter也就会触发getter,他们两个是相互独立的。我们这里修改了fullName会触发getter是因为setter函数里有改变firstName 和 lastName 值的代码。也就是说我们如果注释掉上边的setter中修改firstName 和lastName的代码后就不会执行getter,如下:

set(newValue){
    console.log('computed setter...')
    //var names = newValue.split(' ')
   //this.firstName = names[0]
  // this.lastName = names[names.length - 1]
  return this.firstName + ' ' + this.lastName
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

会执行,且顺序如下

console.log('computed setter...')
console.log('updated')
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/540759
推荐阅读
相关标签
  

闽ICP备14008679号