Vue中computed和watch的区别

343 阅读1分钟

computed

计算属性的意思。它会根据所依赖的数据动态显示新的结果,计算结果将会被缓存。当依赖的属性没有发生变化,那么调用当前函数的时候会从缓存中读取。

例:

// 引用完整版 Vue,方便讲解
import Vue from "vue/dist/vue.js";

Vue.config.productionTip = false;
let id = 0;
const createUser = (name, gender) => {
  id += 1;
  return { id: id, name: name, gender: gender };
};
new Vue({
  data() {
    return {
      users: [
        createUser("小明", "男"),
        createUser("小红", "女"),
        createUser("张三", "男"),
        createUser("李四", "女")
      ],
      gender: ""
    };
  },
  computed: {
    displayUsers() {
      const hash = {
        male: "男",
        female: "女"
      };
      const { users, gender } = this;
      if (gender === "") {
        return users;
      } else if (typeof gender === "string") {
        return users.filter(u => u.gender === hash[gender]);
      } else {
        throw new Error("gender 的值是意外的值");
      }
    }
  },
  methods: {
    setGender(string) {
      this.gender = string;
    }
  },
  template: `
    <div>
      <div>
      <button @click="setGender('') ">全部</button>
      <button @click="setGender('male')">男</button>
      <button @click="setGender('female')">女</button></div>
      <ul>
        <li v-for="(u,index) in displayUsers" :key="index">{{u.name}} - {{u.gender}}</li>
      </ul>
      
    </div>
  `
}).$mount("#app");

watch

监听的意思。它更像一个data的数据监听回调,当依赖数的据发生变化时,就会执行相应的函数。方法上是去监听传入属性的新旧值(new Value和oldValue)。用于监听和观察页面上的vue实例,当数据变化时执行异步操作。

接受两个选项

  • immediate.表示在第一次渲染时是否执行该函数
  • deep. 表示监听一个对象时是否看它里面的属性