computed属性的getter和setter函数

2,286 阅读2分钟

vue中的computed属性包含有两种形式:一种是函数,另一种是对象,对象中包含getter和setter函数。
实际上,每个computed属性都包含了getter以及setter函数,只不过默认情况下使用的都是getter函数,可以省略不写,也就是第一种方式。如果要使用setter函数,那么必须用第二种方式,写上setter函数。

方式一:

computed:{
    fullName(){
        return ...
    }
}

方式二:

computed:{
    fullName:{
        get(){
            return ...
        },
        set(value){
            
        }
    }
}

1. 计算属性的getter函数
当其依赖的响应式属性的值发生变化的时,这个计算属性的值也会自动更新。多用于"data,computed"的属性。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://unpkg.com/vue@next"></script>
  </head>
  <body>
    <div id="rm">
      <input type="text" v-model="value" />
      <div>{{getData}}</div>
    </div>
    <script>
      Vue.createApp({
        data() {
          return {
            value: "",
          };
        },
        computed: {
          getData: {
            get() {
              return new Date() + this.value;
            },
          },
        },
      }).mount("#rm");
    </script>
  </body>
</html>

注意点:

  • getter函数必须要有return返回值,否则会报错。
  • computed属性有缓存,当computed所依赖的响应式数据发生变化时,computed属性才会执行。但是并不是所有数据变化都会导致computed属性执行。例如,上述例子的new Date()变化就不会重新执行getData计算属性。只有当computed所依赖的变量是响应式数据时,当响应式变量发生变化时,this.value变化时才会执行。

2. 计算属性的setter函数
当赋值给计算属性的时候,将调用setter函数。多用于在模板组件中需要修改计算属性自身的值的时候。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://unpkg.com/vue@next"></script>
  </head>
  <body>
    <div id="rm">
      firstName: <input type="text" v-model="firstName" /><br />
      lastName: <input type="text" v-model="lastName" /><br />
      fullname: <input type="text" v-model="fullName" /><br />
      <div>{{fullName}}</div>
    </div>
    <script>
      Vue.createApp({
        data() {
          return {
            firstName: "zhang",
            lastName: "san",
          };
        },
        computed: {
          fullName: {
            get() {
              console.log("getter");
              return this.firstName + " " + this.lastName;
            },
            set(value) {
              console.log("setter", value);
              const newName = value.split(" ");
              this.firstName = newName[0];
              this.lastName = newName[newName.length - 1];
              return this.firstName + " " + this.lastName;
            },
          },
        },
        updated() {
          console.log("updated");
        },
      }).mount("#rm");
    </script>
  </body>
</html>

  • 简单理解,getter为获取值,setter为设置值。 当firstName、lastName响应式数据发生变化时,computed计算属性的getter函数会执行,控制台会依次打印出:getter、updated。但是setter函数不会执行,只有当重新给fullName赋值的时候,setter才会执行,执行顺序是:setter > getter > updated。注意,上述例子之所以setter函数执行,也会执行getter和updated函数,是因为在setter函数中改变了firstName、lastName响应式数据的值,才会导致getter、updated函数的执行。setter函数执行是独立的,与getter函数是否执行无关。

  • setter函数接受一个参数,是setter函数执行时设置的fullName的值。