Vue(computed,watch属性)

95 阅读1分钟

Computed计算属性

为什么要使用computed而不是method?
方式的结果完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 computed计算的值 还没有发生改变,多次访问 comuputed中的计算属性 计算属性会立即返回之前的计算结果,而不必再次执行函数。

computed中的getter
computed 的属性可以被视为是 data 一样,可以读取和设值,因此在 computed 中可以分成 getter(读取) 和 setter(设值),一般情况下是没有 setter 的,computed 预设只有 getter ,也就是只能读取,不能改变设值。
vue.js计算属性默认只有 getter,因为是默认值所以我们也常常省略不写,但在TS代码风格的Vue中需要写get。
JS:

export default {
  computed: {
    money() {
      return this.count * this.price;
    },
  },
};

TS:

```
import { Component, Vue } from "vue-property-decorator";

@Component
export default class Home extends Vue {
  private get money(): number {
    return this.count * this.price;
  }
}

Watch侦听属性:

通过watch提供方法来响应数据变化,当执行异步,或开销较大操作的时候往往使用Watch
当被监听属性的值发生变化的时候执行
简单监听:

**语法:\
    watch: {**

**// newVal: 当前最新值\
// oldVal: 上一刻的值\
      变量名 (newVal, oldVal){\
        // 变量名对应值改变这里自动触发\
      }\
    }**

深度监听:

语法:

watch: {
    "要侦听的属性名": {
        immediate: true, // 立即执行
        deep: true, // 深度侦听复杂类型内变化
        handler (newVal, oldVal) {
            
        }
    }
}

example:

<template>
  <div>
    <input type="text" v-model="user.name">
    <input type="text" v-model="user.age">
  </div>
</template>
 
<script>
export default {
  data(){
    return {
      user: {
        name: "",
        age: 0
      }
    }
  },
  // 目标: 侦听对象
  watch: {
        // 第一种:监听整个对象,对象里的每个属性值的变化都会执行handler
        // 注意:属性值发生变化后,handler执行后获取的 newVal 值和 oldVal 值是一样的
    user: {
      handler(newVal, oldVal){
        console.log(newVal, oldVal);
      },
      deep: true,
      immediate: true
    }
  }
// 目标: 精确侦听对象中的某个值
 watch: {
       // 第二种方式:监听对象的某个属性,被监听的属性值发生变化就会执行函数
       // 函数执行后,获取的 newVal 值和 oldVal 值不一样
    'user.name': {
      handler(newVal, oldVal){
        console.log(newVal, oldVal);
      },
      deep: true,
      immediate: true
    }
  }
}
</script>

1.固定方法触发,侦听函数名必须叫handler
2.deep是开启深度监听
3.immediate立即侦听,当页面初始化的时候立即执行