watch和computed Vue中两个强大的特性

Vue是一个用于构建用户界面的渐进式框架,它提供了一些强大的特性来实现数据驱动视图和响应式系统。其中两个重要的特性就是watch和computed。

watch和computed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:当某一个数据(称它为依赖数据)发生变化的时候,所有依赖这个数据的“相关”数据“自动”发生变化,也就是自动调用相关的函数去实现数据的变动。

那么,watch和computed有什么区别呢?简单来说,watch主要用于观察某个数据的变化,并在变化时执行一些操作;而computed主要用于计算某个数据,并将计算结果缓存起来供视图使用。

具体来说:

watch适合用于处理异步操作或开销较大的操作。例如,在用户输入时发送ajax请求或验证表单等。watch可以接收两个参数:新值和旧值,并根据需要进行比较或处理。

computed适合用于处理同步操作或开销较小的操作。例如,在模板中显示复杂计算后的结果或过滤列表等。computed可以返回一个值,并且只有当依赖数据发生变化时才会重新计算。

watch通常需要在data中定义初始值;而computed不需要在data中定义初始值,因为它本身就是一个函数。

watch可以监听多个数据,并且可以监听深层次的属性变化;而computed只能监听单个数据,并且不能监听深层次的属性变化。

watch通常不会改变依赖数据本身;而computed可能会改变依赖数据本身(如果使用setter方法)。

下面给出一个简单的例子来说明watch和computed的区别:

<template>
  <div>
    <p>输入姓名:</p>
    <input v-model="name" />
    <p>输入年龄:</p>
    <input v-model.number="age" />
    <p>姓名:{{ name }}</p>
    <p>年龄:{{ age }}</p>
    <p>是否成年:{{ isAdult }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      name: "",
      age: 0,
    };
  },
  computed: {
    // 计算是否成年
    isAdult() {
      return this.age >= 18;
    },
  },
  watch: {
    // 监听姓名变化
    name(newVal, oldVal) {
      console.log(`姓名从${oldVal}变成了${newVal}`);
      // 假设发送ajax请求
      // axios.post("/api/user", { name: newVal });
    },
  },
};
</script>

在这个例子中:

  • 我们使用了v-model指令来实现双向绑定,即当用户输入时更新data中对应的属性,当data中对应属性更新时更新视图中对应元素。

  • 我们使用了computed属性isAdult来计算是否成年,并将结果显示在视图中。注意我们没有在data中定义isAdult属性,因为它是由age属性计算得到的。只有当age属性发生变化时isAdult属性才会重新计算,并且计算结果会被缓存起来,不会每次都重新计算。

  • 我们使用了watch属性name来监听姓名的变化,并在变化时执行一些操作。注意我们在data中定义了name属性的初始值,因为它是用户输入的。每当name属性发生变化时,watch函数就会接收新值和旧值,并打印出来。我们也可以在这里做一些异步操作,比如发送ajax请求等。

这就是watch和computed的区别和用法,希望对你有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 ,`watch` 和 `computed` 的用法和 Vue 2 略有不同。 ## watch ### 监听单个响应式数据 在 Vue 3 ,你可以使用 `watch` 函数来监听一个响应式数据的变化。例如: ```javascript import { watch } from 'vue'; // 在 setup 函数使用 watch setup() { const count = ref(0); watch(count, (newValue, oldValue) => { console.log(`count 从 ${oldValue} 变为 ${newValue}`); }); return { count }; } ``` 在上面的例子,我们使用 `watch` 函数监听了 `count` 的变化,并在回调函数输出了新旧值。 ### 监听多个响应式数据 如果需要监听多个响应式数据的变化,你可以传入一个对象,对象的属性名是需要监听的数据,属性值是回调函数。例如: ```javascript import { watch, ref } from 'vue'; // 在 setup 函数使用 watch setup() { const count1 = ref(0); const count2 = ref(0); watch({ count1: (newValue, oldValue) => { console.log(`count1 从 ${oldValue} 变为 ${newValue}`); }, count2: (newValue, oldValue) => { console.log(`count2 从 ${oldValue} 变为 ${newValue}`); } }); return { count1, count2 }; } ``` ### 监听非响应式数据 如果需要监听非响应式数据的变化,你可以使用 `watchEffect` 函数。例如: ```javascript import { watchEffect } from 'vue'; // 在 setup 函数使用 watchEffect setup() { let count = 0; watchEffect(() => { console.log(`count 变为 ${count}`); }); return { count }; } ``` ## computedVue 3 ,你可以使用 `computed` 函数来创建计算属性。例如: ```javascript import { computed, ref } from 'vue'; // 在 setup 函数使用 computed setup() { const count = ref(0); const doubleCount = computed(() => { return count.value * 2; }); return { count, doubleCount }; } ``` 在上面的例子,我们创建了一个计算属性 `doubleCount`,它的值是 `count` 的两倍。当 `count` 改变时,`doubleCount` 也会自动更新。 需要注意的是,计算属性的返回值必须是一个响应式数据。如果返回的是普通数据,那么计算属性就没有意义了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值