掌握Vue侦听器(watch)的应用

文章目录

    • 🍁watch 的优缺点
      • 🍂Watch 优点
      • 🍂Watch 缺点
    • 🍁watch 的用法
      • 🍂对象式 watch
      • 🍂函数式 watch
    • 🍁代码示例
      • 🍂监听基本数据类型
      • 🍂监听复杂数据类型(Object,array)
    • 🍁综合应用 Tips

Vue.js 是一个流行的 JavaScript 框架,而其中的 侦听器(watch) 功能是其中的一项重要特性。它可以用来侦听 Vue 实例中数据的变化,并在变化发生时执行相应的操作。本篇博客将深入探讨 Vue 侦听器的相关内容,包括其优缺点、用法以及 Tips 等。

🍁watch 的优缺点

🍂Watch 优点

  • 📒可以在数据发生变化时执行自定义的回调函数,从而可以用于控制流程跳转和生成数据计算逻辑等场景;
  • 📒相对于 computed 计算属性而言,watch 更加灵活,因为可以在回调函数中进行任意代码操作,而 computed 属性的计算则更为“规范化”,主要是用于生成属性,而不需要进行过多的业务逻辑;
  • 📒Watch 功能与 Vue 中的计算属性、监听属性、组件生命周期等之间构成了合理的拓扑结构,可以应对复杂的应用场景,做到周到全面的数据侦听。

🍂Watch 缺点

  • 📒Watch 需要使用一个回调函数作为参数。如果回调函数中的代码太多,会导致代码混乱,可维护性降低;
  • 📒Watch 回调函数中的代码执行会相对于 computed 计算属性更为频繁,因为 computed 在依赖于它的属性发生变化前不会重新计算,而 watch 在数据发生变化时就会执行回调函数。如果 watch 回调函数中的代码执行太耗时,可能会导致页面卡顿等问题。
    因此,在使用 Watch 功能时,需要对性能和可维护性进行平衡和考虑。

🍁watch 的用法

在 Vue 中使用 watch 可以分为两种方式:对象式 watch 和 函数式 watch。

🍂对象式 watch

对象式 watch 的基本形式为:

//Vue实例中的data
data(){return {   user:{name:'',age:''}}
}

// 在 Vue实例中使用 watch

watch:{'user.name'(newVal,oldVal){console.log(newVal,oldVal)}
}

上述代码中,watch 中的属性值为字符串,用来表示需要侦听的属性。属性值可以是一个带点的路径,以便进行深度侦听。用户只需要在watch中加入一个字符串即可。

对于对象式 Watch,Vue 提供了如下选项:

  • 📒handler:回调函数。

  • 📒immediate:即使在 data 上没有初始值时,Watch 也会立即执行回调。它可以是 true 或 false。

  • 📒deep:如果对象中的所有属性的值发生变化,则 Watch 会触发回调函数。它可以是 true 或 false。

🍂函数式 watch

函数式 watch 的基本形式为:

//Vue实例中的data

data() {return {   watches: {'user.name': {handler: 'userNameChangeHandler',immediate: true},'user.age': {handler(val, oldVal) {console.log(`年龄变化了,新值: ${val},旧值: ${oldVal}`)}}},}
},

// 在 Vue实例中使用 watch

methods: {userNameChangeHandler(newVal, oldVal) {console.log(`用户名变化了,新值: ${newVal},旧值: ${oldVal}`)}
},
watch: {watches: {deep: true,  //深度监视handler: function (val, oldVal) {for (let key in val) {let watchOption = val[key];this.$watch(key, watchOption.handler, { deep: watchOption.deep || false, immediate: watchOption.immediate || false })}}}
}

上述代码中,使用了函数式 Watch 的方式。这种方式的好处是可以在组件中集中管理和处理多个侦听器,提高代码的可维护性和可读性。在上述代码中,我们将需要侦听的属性和对应的回调函数放在一个名为 “watches” 的对象中,使用 $watch 方法进行遍历并侦听属性的变化,从而执行相应的回调函数。

在函数式 Watch 中,我们可以为每个属性定义一个独立的回调函数,也可以直接在 handler 中编写回调逻辑,它提供了更大的灵活性和复用性。

需要注意的是,在函数式 Watch 中,我们使用了一个特殊的 watch 对象来进行侦听操作,并在 watch 对象里的属性中定义了需要侦听的属性和对应的回调函数。然后在组件的 watch 选项中使用 $watch 方法进行遍历监听。

通过对象式 Watch 和函数式 Watch,我们可以根据具体的需求选择合适的方式来使用侦听器。对象式 Watch 适用于简单的侦听需求,而函数式 Watch 则适用于复杂的场景,能够更好的组织和管理侦听器。

🍁代码示例

🍂监听基本数据类型

以下是一个简单的 Vue 组件示例,展示了如何使用对象式 Watch 和函数式 Watch 来监控数据的变化并执行相应的回调函数:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>vue 侦听器</title></head><body><div id="app"><template><div><p>{{ text }}</p><button @click="changeText">Change Text</button><p>{{ count }}</p><button @click="incrementCount">Increment Count</button></div></template></div><script src="./vue.js"></script><script>new Vue({el: '#app',data() {return {text: 'Hello World',count: 0};},watch: {text(newText, oldText) {console.log('Text has changed:', oldText, '=>', newText);},count(newCount, oldCount) {console.log('Count has changed:', oldCount, '=>', newCount);}},methods: {changeText() {this.text = 'New Text';},incrementCount() {this.count++;}}});</script></body>
</html>

上述代码中的 Vue 组件,包含了一个文字显示和一个按钮。点击按钮可以改变文字的内容。

在 watch 对象中,我们定义了两个对象式 Watch。一个是对 text 属性进行侦听,另一个是对 count 属性进行侦听。当这两个属性发生变化时,对应的回调函数会被执行。

在 created 钩子函数中,我们使用函数式 Watch 来监控 count 属性的变化。通过 this.$watch 方法,我们将 this.count 包裹在一个函数中作为侦听的目标属性,然后定义了一个函数作为回调函数。当 count 发生变化时,回调函数将会被触发执行。

在组件的 changeText 方法中,我们通过修改 text 的值来模拟 text 属性的变化。同时,也会触发相应的 Watch 回调函数。

通过这个示例,你可以了解到如何使用对象式 Watch 和函数式 Watch 来监控属性的变化,并在发生变化时执行相应的操作。

🍂监听复杂数据类型(Object,array)

在 Vue 中,监听数组对象的变化可能是比较复杂的,因为不仅需要监听数组的变化,还要监听数组中每个对象的变化。

为了解决这个问题,Vue 提供了两种解决方法:使用 $watch 监听数组对象或使用 deep 选项监听数组对象。

<template><div><h2>Users</h2><ul><li v-for="user in users" :key="user.id">{{ user.name }}<button @click="deleteUser(user)">Delete</button></li></ul></div>
</template><script>
export default {data() {return {users: [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Charlie' }]};},mounted() {this.$watch('users',(newVal, oldVal) => {console.log('users has changed:');console.log('newVal:', newVal);console.log('oldVal:', oldVal);},{ deep: true } // 进行深度监听);},methods: {deleteUser(user) {// 从数组中删除指定的用户对象const index = this.users.findIndex(u => u.id === user.id);this.users.splice(index, 1);}}
};
</script>

在上述代码中,我们定义了一个包含三个对象的 users 数组。在 mounted 钩子函数中使用 $watch 方法监听 users 数组的变化,并设置 deep: true 表示进行深度监听。

同时,我们定义了一个 deleteUser 方法,用于从数组中删除指定的用户对象。该方法会触发 users 数组的变化,从而执行 $watch 中的回调函数。

🍁综合应用 Tips

在使用侦听器时,以下是一些综合应用的 Tips,有助于更好地使用和优化侦听器:

  • 📒可以使用 immediate 选项来在组件创建时立即执行一次回调函数。

  • 📒可以使用 deep 选项来深度侦听对象或数组的变化。

  • 📒可以使用 watch 数组来同时侦听多个属性的变化,可以简化代码。

  • 📒可以使用 $watch 方法进行动态添加和移除侦听器。

  • 📒在回调函数中可以使用异步操作,比如发送网络请求、操作 DOM 等。

综上所述,侦听器(watch)是 Vue.js 中一个非常有用的特性,可以在数据发生变化时执行相应的回调函数。通过对象式 Watch 和函数式 Watch 的方式,我们可以根据不同的需求选择合适的方式来使用侦听器,并通过一些 Tips 来提高代码的可读性和性能。


🏫博客主页:魔王-T

🥝大鹏一日同风起 扶摇直上九万里

❤️感谢大家点赞👍收藏⭐评论✍️


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPLT(有空就写)

L2 - 047 锦标赛 思路&#xff1a; 将其放入一颗满二叉树上去考虑&#xff1a;从二叉树的最底层开始&#xff0c;每一轮比赛&#xff0c;为同一个祖先的左右两个儿子进行比较&#xff0c;而你需要将败者的能力值填到左右两个儿子其中一个上面&#xff0c;另一个就向上传递表示胜…

Day51:503.下一个更大元素II、42. 接雨水

文章目录 503.下一个更大元素II思路代码实现 42. 接雨水思路代码实现 503.下一个更大元素II 题目链接 思路 这道题和下一个更大元素 I的不同之处在于这个查找是循环的。 循环直接可以用查找两次来解决&#xff0c;所以题目步骤唯一不同的就是循环的终止位置。 for(int i1;i…

2023 IoTDB 用户大会倒计时 3 天 | 1 分钟让你了解 IoTDB!

叮叮&#xff01;距离 2023 IoTDB 用户大会在北京与大家见面还有 3 天&#xff01; 这场筹备已久的盛会&#xff0c;汇集了超 20 位大咖嘉宾带来的精彩议题&#xff0c;届时来自美国国家工程院、清华大学软件学院的产业大拿&#xff0c;与能源电力、钢铁冶炼、城轨运输、智能制…

【shell】正则表达式和AWK

一.正则表达式 通配符匹配文件&#xff08;而且是已存在的文件&#xff09; 基本正则表达式扩展正则表达式 可以使用 man 手册帮助 正则表达式&#xff1a;匹配的是文章中的字符 通配符&#xff1a;匹配的是文件名 任意单个字符 1.元字符&#xff08;字符匹配&…

NOIP2007提高组第二轮T3:矩阵取数游戏

题目链接 [NOIP2007 提高组] 矩阵取数游戏 题目描述 帅帅经常跟同学玩一个矩阵取数游戏&#xff1a;对于一个给定的 n m n \times m nm 的矩阵&#xff0c;矩阵中的每个元素 a i , j a_{i,j} ai,j​ 均为非负整数。游戏规则如下&#xff1a; 每次取数时须从每行各取走一…

恒驰服务 | 华为云云上运维服务offering

恒驰运维服务主要针对运维要求高或自身运维能力有限的客户&#xff0c;通过服务增购的形式&#xff0c;提供运维服务以协助客户做好云上资源运维管理&#xff0c;规避业务风险&#xff0c;降低运维开销&#xff0c;提升客户业务稳定性。 适用场景&#xff1a; 如何保障业务稳定…

内衣洗衣机哪个牌子好用?性价比高的迷你洗衣机推荐

洗衣机是现代家庭中必备的一种家用电器&#xff0c;它的使用简便、省时、省力&#xff0c;是我们生活中不可缺少的一部分&#xff0c;差不多家家户户都有一台&#xff0c;甚至两台以上。由于内衣内裤并不能够直接扔进洗衣机里进行清洗&#xff0c;因此一种内衣专业的洗衣机就出…

单机zk安装与zk四字命令

一、下载 Apache ZooKeeper可以在 Linux 系统中使用 wget 命令直接下载&#xff0c;官网地址 Apache ZooKeeper 二、解压 tar -zxvf apache-zookeeper-3.8.3-bin.tar.gz 进去解压的目录中&#xff0c; 进入到 zk 解压目录的 conf 目录&#xff0c;复制 zoo_sample.cfg 文件&a…

6.golang函数、指针、结构体

函数 函数是执行特定任务的代码块。函数接受输入&#xff0c;对输入执行一些计算&#xff0c;然后生成输出。 函数声明 在 go 中声明函数的语法是&#xff1a; func name(parameter) (result-list){//body }函数声明以func关键字开头&#xff0c;后跟name(函数名)。在括号中…

如何判别使用的junit是4还是5

Junit4与Junit5的版本中&#xff0c;Test注解的包位置不同。 Junit4的Test注解是在org.junit包下&#xff0c;儿Junit5的Test注解是在org.junit.jupiter.api包下。 可据此判定是使用的Junit4还是Junit5。 Junit4 import org.junit.Test;Junit5 import org.junit.jupiter.api…

简单实用:isPalindrome方法在密码验证中的应用

在信息安全领域中&#xff0c;密码验证是非常重要的一部分。一个好的密码应该有足够的复杂度&#xff0c;以防止被破解。而回文密码由于正读和反读都一样这样特殊的性质&#xff0c;具有很高的安全性&#xff0c;可以发挥很大的作用。在实际的密码策略中&#xff0c;我们可能会…

2023认证杯B题:金属表面缺陷检测|数学中国数学建模国际赛(小美赛) |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看认证杯的B题&#xff01; 完整内容可以在文章末…

你对SPA单页面的理解,它的优缺点分别是什么?

面试官&#xff1a;你对SPA单页面的理解&#xff0c;它的优缺点分别是什么&#xff1f;如何实现SPA应用呢 一、什么是SPA SPA&#xff08;single-page application&#xff09;&#xff0c;翻译过来就是单页应用SPA是一种网络应用程序或网站的模型&#xff0c;它通过动态重写当…

Whisper

文章目录 使后感Paper Review个人觉得有趣的Log Mel spectrogram & STFT Trainingcross-attention输入cross-attention输出positional encoding数据 Decoding为什么可以有时间戳的信息 Test code 使后感 因为运用里需要考虑到时效和准确性&#xff0c;类似于YOLO&#xff…

vue3使用动态component

使用场景&#xff1a; 多个组件通过component标签挂载在同一个组件中&#xff0c;通过触发时间进行动态切换。vue3与vue2用法不一样&#xff0c;这里有坑&#xff01; 使用方法&#xff1a; 1.通过vue的defineAsyncComponent实现挂载组件 2.component中的is属性 父组件&am…

git小白初学习

#1. 安装 http://npm.taobao.org/mirrors/git-for-windows/ #2. 设置自己的用户信息&#xff0c;方便各个节点知道这个客户端是谁 #全局设置 git config --global user.name ‘xyg’ git config --global user.email ‘1584066465qq.com’ #对单个仓库设置 cd 到对应仓库下 g…

GaussDB如何进行性能调优

GaussDB如何进行性能调优 GaussDB性能调优过程需要综合考虑多方面因素&#xff0c;因此&#xff0c;调优人员应对系统软件架构、软硬件配置、数据库配置参数、并发控制、查询处理和数据库应用有广泛而深刻的理解。 调优流程 调优各阶段说明&#xff0c;如下表所示。 数据库性…

深入探究Photoshop图像修复与润饰技巧

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在Photoshop中&#xff0c;图像修复和润饰是强…

Vim Coc插件实现代码跳转

Vim Coc插件实现代码跳转 按照coc主页的配置 里面是有提供代码跳转的功能的 具体配置如下 " GoTo code navigation nmap <silent> gd <Plug>(coc-definition) nmap <silent> gy <Plug>(coc-type-definition) nmap <silent> gi <Plug…

CNN对 MNIST 数据库中的图像进行分类

加载 MNIST 数据库 MNIST 是机器学习领域最著名的数据集之一。 它有 70,000 张手写数字图像 - 下载非常简单 - 图像尺寸为 28x28 - 灰度图 from keras.datasets import mnist# 使用 Keras 导入MNIST 数据库 (X_train, y_train), (X_test, y_test) mnist.load_data()print(&…