Vue3开发极简入门(7):watchEffect
ztj100 2025-06-10 04:17 8 浏览 0 评论
侦听响应式对象的某个属性(使用getter函数)
一个响应式对象,如果内容比较多,层级比较深,全侦听的话,很耗资源。实际开发中,通常只需要侦听内部几个属性即可。
<template>
<div class="watchDemo">
<h1>D:侦听响应式对象的属性</h1>
车队长姓名:{{ vehicleGroup.leaderName }}
<ul>
<li>车辆A:{{ vehicleGroup.vehicleA.driverName }},{{ vehicleGroup.vehicleA.carPlateNo }}</li>
<li>车辆B:{{ vehicleGroup.vehicleB.driverName }},{{ vehicleGroup.vehicleB.carPlateNo }}</li>
</ul>
<button @click="changeLeader">修改车队长</button>
<button @click="changeVehicleA">修改车A</button>
<button @click="changeVehicleB">修改车B</button>
<button @click="changeAllVehicle">修改车队</button>
</div>
</template>
<script lang='ts' setup name='WatchDemo'>
import { reactive,watch } from 'vue'
let vehicleGroup = reactive({ leaderName: "车队长A", vehicleA: { driverName: "车A司机", carPlateNo: "车A车牌号" }, vehicleB: { driverName: "车B司机", carPlateNo: "车B车牌号" } })
function changeLeader() {
vehicleGroup.leaderName = vehicleGroup.leaderName + "+"
}
function changeVehicleA() {
vehicleGroup.vehicleA.carPlateNo = vehicleGroup.vehicleA.carPlateNo + "-"
vehicleGroup.vehicleA.driverName = vehicleGroup.vehicleA.driverName + "-"
}
function changeVehicleB() {
vehicleGroup.vehicleB.carPlateNo = "车B车牌号~~new"
vehicleGroup.vehicleB.driverName = "车B司机~~~~new"
}
function changeAllVehicle() {
vehicleGroup.vehicleA = { driverName: "张师傅", carPlateNo: "经A88888" }
vehicleGroup.vehicleB = { driverName: "李师傅", carPlateNo: "齐C66666" }
}
//侦听对象的基本类型
//watch(getLeaderName, (newVal, oldVal) => {
// console.log('车队长变了:', newVal, oldVal);
//})
// function getLeaderName(){
// return vehicleGroup.leaderName
// }
// 简单写法
watch(() => vehicleGroup.leaderName, (newVal, oldVal) => {
console.log('车队长变了:', newVal, oldVal);
})
// 侦听对象的对象
// 写法1,侦听属性对象。changeVehicleA可以侦听,changeAllVehicle无法侦听
// watch(vehicleGroup.vehicleA,(newVal,oldVal)=>{
// console.log('车A变了:', newVal, oldVal);
// })
// 写法2,侦听属性对象的getter函数。changeVehicleA无法侦听,changeAllVehicle可以侦听
// watch(()=>vehicleGroup.vehicleA,(newVal,oldVal)=>{
// console.log('车A变了:', newVal, oldVal);
// })
// 写法3,侦听属性对象的getter函数,并开启深度侦听。changeVehicleA、changeAllVehicle都可以侦听
watch(() => vehicleGroup.vehicleA, (newVal, oldVal) => {
console.log('车A变了:', newVal, oldVal);
}, { deep: true })
</script>
<style>
.watchDemo {
background-color: darkkhaki;
}
</style>
- 如果侦听的属性是基本类型,按照 简单写法 即可。
- 如果侦听的属性是对象,按照 写法3,无论是修改对象的内部属性,还是修改整个对象,都能触发侦听。
watch数组&watchEffect
前文介绍的都是watch一个数据源,在实际的开发中,我们一般是侦听多个数据源,综合考虑进行逻辑处理,其方法如下:
<template>
<div class="watchEffectDemo">
<h1>Watch数组</h1>
姓名:<input type="text" v-model="jobSeeker.userName" required>
年龄:<select v-model="jobSeeker.age" required>
<option v-bind:value="0">请选择</option>
<option v-bind:value="34">34岁</option>
<option v-bind:value="35">35岁</option>
<option v-bind:value="36">36岁</option>
</select>
学历:<select v-model="jobSeeker.eduBg">
<option v-for="option in eduBgs" v-bind:value="option.value" required>
{{ option.text }}
</option>
</select>
</div>
</template>
<script lang='ts' setup name='WatchEffectDemo'>
import { reactive, watch } from 'vue'
let eduBgs = [{ value: 0, text: "请选择" }, { value: 1, text: "博士" }, { value: 2, text: "硕士" }, { value: 3, text: "本科" }, { value: 99, text: "大专" }]
let jobSeeker = reactive({ userName: "", eduBg: 0, age: 0 })
watch([() => jobSeeker.age, () => jobSeeker.eduBg], (newVal) => {
let [age, eduBg] = newVal
if (age === 0 || eduBg === 0) {
return
}
if (age < 35 && eduBg < 99) {
console.log('发送请求:', jobSeeker);
alert("真的已提交")
} else {
console.log('并没有提交', jobSeeker);
alert("已提交")
}
})
</script>
<style>
.watchEffectDemo {
background-color: lavender;
}
</style>
- 与watch基本一致,只是数据源那里,变成了数组。
- 回调函数3个参数【新值、旧值、副作用清理回调函数】,后两个本节不需要,就没写。
- 与watch一个数据源一样,该注意的,watch多个数据源也一样注意,本节不赘述。
这样固然解决了watch多个数据源的需求,但在实际工作,watch的可能有N个数据源,全写在数组就很繁冗了,这就引入了watchEffect。
另外,在新版本的Vue中(我的是3.5.13),如果用watch侦听数组,控制台会提示:
watch(fn, options?)` signature has been moved to a separate API. Use `watchEffect(fn, options?)` instead. `watch` now only supports `watch(source, cb, options?) signature.
官方建议使用watchEffect来侦听多个数据源,改造如下:
watchEffect(() => {
if (jobSeeker.age === 0 || jobSeeker.eduBg === 0) {
return
}
if (jobSeeker.age < 35 && jobSeeker.eduBg < 99) {
console.log('发送请求:', jobSeeker);
alert("真的已提交")
} else {
console.log('并没有提交', jobSeeker);
alert("已提交")
}
})
- watchEffect不用像watch那样,指定要侦听的数据源,它会自动跟踪回调的响应式依赖。
- watchEffect会立即执行一次回调函数,类似watch里的{immediate:true}。
- watchEffect拿不到原值。
相关推荐
- 再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)
-
在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...
- python创建分类器小结(pytorch分类数据集创建)
-
简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...
- matplotlib——绘制散点图(matplotlib散点图颜色和图例)
-
绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...
- python实现实时绘制数据(python如何绘制)
-
方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...
- 简单学Python——matplotlib库3——绘制散点图
-
前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...
- 数据分析-相关性分析可视化(相关性分析数据处理)
-
前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...
- 免费Python机器学习课程一:线性回归算法
-
学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...
- 用Python进行机器学习(2)之逻辑回归
-
前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...
- 【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂
-
一、拟合和回归的区别拟合...
- 推荐2个十分好用的pandas数据探索分析神器
-
作者:俊欣来源:关于数据分析与可视化...
- 向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- 用Python进行机器学习(11)-主成分分析PCA
-
我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...
- 神经网络基础深度解析:从感知机到反向传播
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- Python实现基于机器学习的RFM模型
-
CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)