Vue3 watch 监视属性

server/2024/10/17 22:06:42/
  • 作用:监视数据的变化(和Vue2中的watch作用一致)
  • 特点:Vue3中的watch只能监视以下四种数据
  1. ref定义的数据。
  2. reactive定义的数据。
  3. 函数返回一个值(getter函数)。
  4. 一个包含上述内容的数组。

我们在Vue3中使用watch的时候,通常会遇到以下几种情况:

ref定义的基本类型

<template><div class="person"><h2>当前求和{{ sum }}</h2><button @click="changeAddOne">点击加一</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect } from 'vue'// 数据
let sum = ref(0);// 方法
function changeAddOne() {sum.value++;
}// 监视 watch(谁,回调函数)
watch(sum, (newValue, oldValue) => {console.log('sum发生变化了', newValue, oldValue);
});
</script>

watch监视里面的ref数据不需要.value

主动停止监视:

<template><div class="person"><h2>当前求和{{ sum }}</h2><button @click="changeAddOne">点击加一</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect } from 'vue'// 数据
let sum = ref(0);// 方法
function changeAddOne() {sum.value++;
}// 监视 watch(谁,回调函数)
const stopWatch = watch(sum, (newValue, oldValue) => {console.log('sum发生变化了', newValue, oldValue);if(newValue >= 10) {stopWatch();}
});
</script>

ref定义的对象数据

监视ref定义的【对象类型】数据:直接写数据名,监视的是对象的【地址值】,若想监视对象内部的数据,要手动开启深度监视。

注意:

  • 若修改的是ref定义的对象中的属性,newValueoldValue 都是新值,因为它们是同一个对象。
  • 若修改整个ref定义的对象,newValue 是新值, oldValue 是旧值,因为不是同一个对象了。
<template><div class="person"><h2>Person</h2><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="changeAge">年龄+1</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect } from 'vue'// 数据
let person = ref({name: '张三',age: 18
});
// 方法
function changeAge() {person.value.age++;
}// 监视 watch(谁,回调函数)
// 监视的是对象的地址值,若想监视对象内部的属性,需要手动开启深度监视 - deep: true
watch(person, (newVal, oldVal) => {console.log('watch:', newVal, oldVal);
}, {deep: true, immediate: true});
</script>

watch的参数:

  • 第一个参数:被监视的数据
  • 第二个参数:监视的回调
  • 第三个监视:配置对象(deep, imediate)

reactive定义的对象数据

reactive默认监视开启深度监视。

<template><div class="person"><h2>Person</h2><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="changeAge">年龄+1</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect, reactive } from 'vue'// 数据
let person = reactive({name: '张三',age: 18
});
// 方法
function changeAge() {person.age++;
}// 监视 watch(谁,回调函数)
// 默认开始深度监视 
watch(person, (newVal, oldVal) => {console.log('watch:', newVal, oldVal);
}, {immediate: true});
</script>

监视ref/reactive定义的对象类型中某一个属性

监视refreactive定义的【对象类型】数据中的某个属性,注意点如下:

  1. 若该属性值不是【对象类型】,需要写成函数形式。
  2. 若该属性值是依然是【对象类型】,可直接编,也可写成函数,建议写成函数。

结论:监视的要是对象里的属性,那么最好写函数式,注意点:若是对象监视的是地址值,需要关注对象内部,需要手动开启深度监视。

<template><div class="person"><h2>Person</h2><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="changeAge">年龄+1</button><p>车:{{ person.car.c1 }}</p><button @click="changeCarC1">修改第一量车</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect, reactive } from 'vue'// 数据
let person = reactive({name: '张三',age: 18,car:{c1:'宝马',c2:'奔驰'}
});
// 方法
function changeAge() {person.age++;
}
function changeCarC1() {person.car.c1 += '---';
}
// 监视 watch(谁,回调函数)
// 默认开始深度监视 
watch(() => {return person.age
}, (newVal, oldVal) => {console.log('age:', newVal, oldVal);
});
</script>
<template><div class="person"><h2>Person</h2><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="changeAge">年龄+1</button><p>车:{{ person.car.c1 }}</p><button @click="changeCarC1">修改第一量车</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect, reactive } from 'vue'// 数据
let person = reactive({name: '张三',age: 18,car:{c1:'宝马',c2:'奔驰'}
});
// 方法
function changeAge() {person.age++;
}
function changeCarC1() {person.car.c1 += '---';
}
// 监视 watch(谁,回调函数)
// 默认开始深度监视 
watch(() => {return person.car
}, (newVal, oldVal) => {console.log('car:', newVal, oldVal);
}, {deep:true});
</script>

多个数据?

<template><div class="person"><h2>Person</h2><p>姓名:{{ person.name }}</p><p>年龄:{{ person.age }}</p><button @click="changeAge">年龄+1</button><p>车:{{ person.car.c1 }}</p><button @click="changeCarC1">修改第一量车</button></div>
</template><script lang="ts" setup name="Person">
import { computed,watch, ref, watchEffect, reactive } from 'vue'// 数据
let person = reactive({name: '张三',age: 18,car:{c1:'宝马',c2:'奔驰'}
});
// 方法
function changeAge() {person.age++;
}
function changeCarC1() {person.car.c1 += '---';
}
// 监视 watch(谁,回调函数)
// 默认开始深度监视 
watch(() => {return [person.car, person.age]
}, (newVal, oldVal) => {console.log('car:', newVal, oldVal);
}, {deep:true});
</script>

http://www.ppmy.cn/server/131741.html

相关文章

Redis 数据类型list(列表)

目录 1 基本特性 2 主要操作命令 2.1 LPUSH key value [value ...] 2.2 RPUSH key value [value ...] 2.3 LRANGE key start stop 2.4 LINDEX key index 2.5 LLEN key 2.6 LPOP key 2.7 RPOP key 2.8 LTRIM key start stop 2.9 BLPOP key [key ...] timeout 2.10 B…

computed和watch的区别

一、computed&#xff08;计算属性&#xff09; 1. 定义 计算属性是基于 Vue 实例的响应式数据进行计算的属性。它们的值会根据依赖的数据变化而自动更新&#xff0c;并且会被缓存&#xff0c;只有当其依赖的数据发生变化时才会重新计算。 2. 使用场景 衍生状态&#xff1a…

从零开始:用Python编写自己的简单游戏

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在编程的世界里,游戏开发一直是一个既充满乐趣又具有挑战性的领域。很多著名的游戏开发者在年轻时编写了他们的第一个简单游戏,点燃了他们的编程热情。在本文中,我们将带领你使用Python编写一个基础的2D游戏,…

docker简述

1.安装dockers&#xff0c;配置docker软件仓库 安装&#xff0c;可能需要开代理&#xff0c;这里我提前使用了下好的包安装 启动docker systemctl enable --now docker查看是否安装成功 2.简单命令 拉取镜像&#xff0c;也可以提前下载使用以下命令上传 docker load -i imag…

Leetcode 不同路径

重要的一点在于&#xff1a;只能向右或向下移动。 这段代码的算法思想是使用**动态规划&#xff08;Dynamic Programming, DP&#xff09;**来解决问题。其核心思想是通过将问题分解成更小的子问题&#xff0c;并用一个二维数组来保存这些子问题的解&#xff0c;从而避免重复计…

FFmpeg的简单使用【Windows】--- 视频混剪+添加背景音乐

一、功能描述 点击背景音乐区域的【选择文件】按钮&#xff0c;选择音频文件并将其上传到服务器&#xff0c;上传成功后会将其存储的位置路径返回。 然后&#xff0c;点击要处理视频区域的【选择文件】按钮选择要进行混剪的视频素材&#xff08;1-10个&#xff09;。 以上两…

上半年净利下滑85%,光峰科技能否靠“上车”扭转局面?

尽管车载业务环比增了3倍&#xff0c;光峰科技今年上半年的净利润依然同比下滑了85%。 根据光峰科技发布的半年报显示&#xff0c;今年上半年&#xff0c;光峰科技营业收入为10.81亿元&#xff0c;同比微增0.76%&#xff1b;实现归属上市公司股东的净利润为1090.96万元&#x…

2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数

2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数 2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数 文章目录 2.4.ReactOS系统提升IRQL级别KfRaiseIrql 函数KfRaiseIrql 函数 KfRaiseIrql 函数 /*********************************************************************** NAME …