vue3如何监视Reactive对象中的属性

 更新时间:2026年01月23日 15:49:37   作者:袅沫  
文章介绍了Vue.js中的`watch`函数,它可以监听不同的数据源类型,包括ref、响应式对象、getter函数和数组,文章详细说明了如何监听单个数据的属性值和多个属性值,并强调了使用getter函数的重要性,此外,还提到了深度侦听的注意事项

vue3监视Reactive对象中的属性

watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组

框架

<template>
  <div class="divBox">
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <h2>汽车:{{ person.car.brand1 }} 、 {{ person.car.brand2 }}</h2>
    <button @click="changeName">修改姓名</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changeCarName">修改汽车名称</button>
    <button @click="changeCarPrice">修改汽车价格</button>
    <button @click="changeCar">修改汽车</button>
  </div>
</template>

数据源

<script setup name="watchReactive">
import { ref, reactive, watch } from "vue";

const person = reactive({
  name: "张三",
  age: 18,
  car: { brand1: "奔驰", brand2: "奥迪", price: 100000 },
});

function changeName() {
  person.name = person.name + "~";
}
function changeAge() {
  person.age = person.age + 1;
}
function changeCarName() {
  person.car.brand1 = person.car.brand1 + "~";
}
function changeCarPrice() {
  person.car.brand2 = person.car.brand2 + "$";
}
function changeCar() {
  person.car = { brand1: "爱玛电动车", brand2: "小刀就是好", price: 88888 };
}

</script>

数据、方法

监听(Watch)

单个数据的属性值

可以使用以下方式:

1.数据为String/number属性值

<script setup name="watchReactive">

//现在开始进行监视,不能监视对象的属性,只是一个字符串
// watch(person.name,(newValue,oldValue) => {
//     console.log("newValue",newValue);
//     console.log("oldValue",oldValue);
// });

//成功监视!

watch(()=>{return person.name},(newValue,oldValue) => {
    console.log("newValue",newValue);
    console.log("oldValue",oldValue);
});

//推荐指数****
watch(()=> person.name,(newValue,oldValue) => {
    console.log("newValue",newValue);
    console.log("oldValue",oldValue);
});

</script>

2.监听的数据为Object对象时

当我们监听函数中的对象时:

<script setup name="watchReactive">

//不能使用这种方式进行监视,他只是一个字符串
 watch(person.car.brand1,(newValue,oldValue) =>{
     console.log("newValue",newValue);
     console.log("oldValue",oldValue);
 })

<script/>

系统提示:

<script setup name="watchReactive">

/**可以使用这种方式进行监视,
 * 但是只能监视对象中的属性,不能监视对象本身
 * 对象本身,已经不是响应式的对象了,被重新赋值了
 */
 watch(person.car,(newValue,oldValue) =>{
    console.log("newValue",newValue);
    console.log("oldValue",oldValue);
})

<script/>

 以下这种方式,我们只能监视数据对象整体,并不能监视到数据对象中的属性!!!

<script setup name="watchReactive">

//我们尝试监听数据中的对象属性
 watch(()=> person.car,(newValue,oldValue) =>{
     console.log("newValue",newValue);
     console.log("oldValue",oldValue);
 })

</script>

上面虽然可以监视数据中的对象属性,但是并不是最优的,因为其并不能监视对象本身本修改的情况,下面是推荐使用的监听方式 ,既可以监听到对象中的属性,又可以监听到数据本身

<script setup name="watchReactive">

//推荐程度*******
 watch(()=> person.car,(newValue,oldValue) =>{
     console.log("newValue",newValue);
     console.log("oldValue",oldValue);
 },{deep:true})

</script>

监听单个数据的多个属性值

当我们进行监听数据的多个属性值时:

我们可以整体返回一个对象数组,用来监听不同的数据类型:

<script setup name="watchReactive">

/**
 * 监视对象内部多个属性
 */
// watch(()=>{return [person.name,person.car.brand1]},(newValue,oldValue) =>{
//     console.log("newValue",newValue);
//     console.log("oldValue",oldValue);
// },{deep:true})

watch(()=>[person.name,person.car.brand1],(newValue,oldValue) =>{
    console.log("newValue",newValue);
    console.log("oldValue",oldValue);
},{deep:true})
</script>

也可以这样书写:

<script setup name="watchReactive">

//推荐程度*******
watch([() => person.name, () => person.car.brand1],
  (newValue, oldValue) => {
    console.log("newValue", newValue);
    console.log("oldValue", oldValue);
  },{ deep: true });
</script>

好处在于,我们可以针对没个属性进行监视!!!

vue3官方文档

侦听数据源类型​

watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组:

const x = ref(0)
const y = ref(0)

// 单个 ref
watch(x, (newX) => {
  console.log(`x is ${newX}`)
})

// getter 函数
watch(
  () => x.value + y.value,
  (sum) => {
    console.log(`sum of x + y is: ${sum}`)
  }
)

// 多个来源组成的数组
watch([x, () => y.value], ([newX, newY]) => {
  console.log(`x is ${newX} and y is ${newY}`)
})

注意,你不能直接侦听响应式对象的属性值,例如:

const obj = reactive({ count: 0 })

// 错误,因为 watch() 得到的参数是一个 number
watch(obj.count, (count) => {
  console.log(`Count is: ${count}`)
})

这里需要用一个返回该属性的 getter 函数:

// 提供一个 getter 函数
watch(
  () => obj.count,
  (count) => {
    console.log(`Count is: ${count}`)
  }
)

deep谨慎使用

深度侦听需要遍历被侦听对象中的所有嵌套的属性,当用于大型数据结构时,开销很大。因此请只在必要时才使用它,并且要留意性能

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue2.0实现的tab标签切换效果(内容可自定义)示例

    vue2.0实现的tab标签切换效果(内容可自定义)示例

    这篇文章主要介绍了vue2.0实现的tab标签切换效果,结合实例形式分析了vue.js实现内容可自定义的tab点击切换功能相关操作技巧,需要的朋友可以参考下
    2019-02-02
  • Vue 一键清空表单的实现方法

    Vue 一键清空表单的实现方法

    这篇文章主要介绍了Vue 一键清空表单的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 浅谈Vue3 defineComponent有什么作用

    浅谈Vue3 defineComponent有什么作用

    本文主要介绍了Vue3 defineComponent作用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 详解如何在Vue3中实现懒加载组件

    详解如何在Vue3中实现懒加载组件

    随着现代前端框架的发展,懒加载作为一种优秀的性能优化技术,在用户体验和加载速度上扮演着越来越重要的角色,本文将详细介绍如何在 Vue 3 中实现懒加载组件,确保你能够将这一技术应用到自己的项目中,需要的朋友可以参考下
    2024-11-11
  • 手写Vue源码之数据劫持示例详解

    手写Vue源码之数据劫持示例详解

    这篇文章主要给大家介绍了手写Vue源码之数据劫持的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Vue中xlsx的使用方法指南

    Vue中xlsx的使用方法指南

    这篇文章主要给大家介绍了关于Vue中xlsx的使用方法指南,有很多办法都可以实现,其中最简单的还是使用插件xlsx,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • vue动态循环出的多个select出现过的变为disabled(实例代码)

    vue动态循环出的多个select出现过的变为disabled(实例代码)

    本文通过实例代码给大家分享了vue动态循环出的多个select出现过的变为disabled效果,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2019-11-11
  • 在Vue3中生成动态的word文档的示例代码

    在Vue3中生成动态的word文档的示例代码

    这篇文章主要介绍了如何在 Vue 3 中生成动态的 Word 文档,在开发过程中遇到一个需求,动态生成一个word报表,当时考虑了是前端做还是后端做的问题,最后发现两个解决需求的方法都大差不差,但考虑到前端少发一个请求,就此使用的前端来解决,需要的朋友可以参考下
    2024-09-09
  • vue瀑布流组件实现上拉加载更多

    vue瀑布流组件实现上拉加载更多

    这篇文章主要为大家详细介绍了vue瀑布流组件实现上拉加载更多,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Vue 打包优化之externals抽离公共的第三方库详解

    Vue 打包优化之externals抽离公共的第三方库详解

    这篇文章主要为大家介绍了Vue 打包优化之externals抽离公共的第三方库详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪<BR>
    2023-06-06

最新评论