computed 和 watch的区别

简介: computed 和 watch的区别

computed 和 watch的区别


一、computed

computed是计算属性的意思, 根据一个属性计算出一个值,它会根据你所依赖的数据动态显示新的计算结果。计算结果会被缓存, 如果数据没有发生改变则使用缓存,不会重新加载。

写法

类型:{ [key: string]: Function | { get: Function, set: Function } }

// 引用完整版 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");

网络异常,图片无法展示
|

computed的 getter和setter

  • computed的属性可以读取和设值。因此,在computed中可以分为getter(读取)和setter(设值).
  • 一般情况下没有setter,computed只预设了getter,只能读取,不能设值。所以,computed默认格式(是不表明getter函数的).
  • 当赋值给计算属性的时候,将调用setter函数。

二、watch

类型:{ [key: string]: string | Function | Object | Array }

watch 是用来监听数据的。主要用法是当某个数据变化后,做一些操作。

data 的数据发生变化时,就会发生一个回调,他有两个参数,一个val(修改后的 data 数据),一个oldVal(原来的 data数据)

new Vue({
  data: {
    n: 0,
    obj: {
      a: "a"
    }
  },
  template: `
    <div>
      <button @click="n += 1">n+1</button>
      <button @click="obj.a += 'hi'">obj.a + 'hi'</button>
      <button @click="obj = {a:'a'}">obj = 新对象</button>
    </div>
  `,
  watch: {
    n() {
      console.log("n 变了");
    },
    obj:{
      handler: function (val, oldVal) { 
      console.log("obj 变了")
    },
      deep: true // 该属性设定在任何被侦听的对象的 property 改变时都要执行 handler 的回调,不论其被嵌套多深
    },
    "obj.a":{
      handler: function (val, oldVal) { 
      console.log("obj.a 变了")
    },
      immediate: true // 该属性设定该回调将会在侦听开始之后被立即调用
    }
  }
}).$mount("#app");
  1. immediat:ture表示让值最初时候watch就执行
  2. deep表示对对象里面的变化进行深度监听
  3. 不支持缓存,数据变,直接会触发相应的操作

如果一个值依赖多个属性(多对一),用computed肯定是更加方便的。如果一个值变化后会引起一系列操作,或者一个值变化会引起一系列值的变化(一对多),用watch更加方便一些。

watch 支持异步代码而 computed 不支持。

相关文章
|
7月前
|
缓存 JavaScript API
在vue中,computed 和 watch 的区别和运用的场景?
在vue中,computed 和 watch 的区别和运用的场景?
96 0
|
缓存 JavaScript
vue中computed和watch的区别
vue中computed和watch的区别
|
4月前
|
缓存 JavaScript API
理解掌握 `watch`、`computed`、`watchEffect`
【8月更文挑战第5天】理解掌握 `watch`、`computed`、`watchEffect`
42 5
|
2月前
|
缓存 JavaScript Serverless
vue中computed计算属性、watch侦听器、methods方法的区别以及用法
vue中computed计算属性、watch侦听器、methods方法的区别以及用法
142 0
|
5月前
|
缓存 JavaScript
计算属性(computed)和侦听器(watch)
计算属性(computed)和侦听器(watch)
67 0
|
7月前
|
缓存 JavaScript
computed/watch深度监听
computed/watch深度监听
219 1
|
7月前
|
缓存 JavaScript
Vue 中的 computed 和 watch 的区别
Vue 中的 computed 和 watch 的区别
|
7月前
|
缓存 JavaScript 前端开发
Vue的计算属性和侦听器:computed和watch的使用
【4月更文挑战第24天】Vue.js框架中的计算属性和侦听器是处理数据变化的关键特性。计算属性(computed)基于依赖缓存,仅在相关数据改变时重新计算,适合处理复杂逻辑。例如,计算总价可基于价格和数量动态更新。而侦听器(watch)在数据变化时执行回调,适用于异步操作和开销大的任务。计算属性与侦听器的主要区别在于缓存机制和应用场景,前者用于同步计算,后者用于响应数据变化后的特殊操作。理解这两者有助于优化Vue应用的性能。
|
缓存
computed和watch
computed和watch
|
缓存 JavaScript
Vue 中 computed 和 watch 的区别
Vue 中 computed 和 watch 的区别
94 0