Vue3 - watch 侦听器(超详细使用教程)

news2024/11/20 3:28:09

前言

它之所以叫侦听器呢,是因为它可以侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数。

大白话说呢,就是你传给 watch 侦听器一个响应式变量,然后当这个变量变化时,自动触发一个你定义的函数,啥呢,就像一个人被监控了一样,只要这个人一动,摄像头就会报警。

回忆 Vue2

先实现一个 Vue2 侦听器小例子。

<template>
  <button @click="sum++">增加数值</button>
</template>

<script>
export default {
  data() {
    return {
      sum: 1,
    }
  },

  watch: {
    // New: 新值 | Old: 老值
    sum(New, Old) {
      console.log(`新值:${New} ——— 老值:${Old}`)
    },
  }
}
</script>

在这里插入图片描述

可以看到,这是一个最最简单的监听示例。

切入 Vue3

在 Vue3 中呢,需要先通过 import 把 watch() 函数引过来才能用。

那么我们用 Vue3 该如何实现,刚才的小示例呢?

<template>
  <button @click="sum++">增加数值</button>
</template>

<script>
import { watch, ref } from 'vue'
export default {
  setup() {
    
    // 响应式变量
    const sum = ref(1)

    // watch是一个函数
    // 第一个参数: 要监听的响应式变量(数据源)
    // 第二个参数:执行的回调函数
    // 第三个参数: 配置(例如deep深度监听/immediate是否立即监听等)
    watch(sum, (New, Old) => {
      console.log(`新值:${New} ——— 老值:${Old}`)
    })

    // return 
    return { sum }
  }
}
</script>

在这里插入图片描述

非常 NIce 啊,既然能监听 ref 响应式变量,那么 reactive 响应式对象能不能监听呢?我们来实现一下啊。

<template>
  <button @click="sum.value++">增加数值</button>
</template>

<script>
import { watch, reactive } from 'vue'
export default {
  setup() {
    
    // 响应式变量
    const sum = reactive({
      value: 1
    })

    // watch是一个函数
    // 第一个参数: 要监听的响应式变量(数据源)
    // 第二个参数:执行的回调函数
    // 第三个参数: 配置(例如deep深度监听/immediate是否立即监听等)
    // 注意:当监听一个对象时,第一个参数数据源必须是函数且返回一个值即 "() => 对象.要监听的属性"
    watch(() => sum.value, (New, Old) => {
      console.log(`新值:${New} ——— 老值:${Old}`)
    })

    // return 
    return { sum }
  }
}
</script>

在这里插入图片描述

可以看到,响应式对象也是可以监听的,注意啊,监听对象与监听普通数据在第一个参数数据源上略有差异。

监听复杂数据对象

咱们真实项目开发,哪有这么简单的数据啊,都是对象套对象,对象里再套数组,非常的复杂。

那么这种情况怎么深度监听呢?

其实很简单,只需要配置一个叫 deep 的属性为 true 即可!

<template>
  <h1>值:{{ sum.car.config.isChina }}</h1>
  <button @click="sum.car.config.isChina = !sum.car.config.isChina">改变数据</button>
</template>

<script>
import { watch, reactive } from 'vue'
export default {
  setup() {
    
    // 复杂嵌套响应式变量
    const sum = reactive({
      car: {
        name: '长安汽车',
        money: 15000,
        config: {
          color: 'black',
          isChina: true,
        }
      }
    })

    // 监听复杂响应式对象
    watch(() => sum.car, (New, Old) => {
      console.log(`新值:${New.config.isChina} ——— 老值:${Old.config.isChina}`)
    })

    // return 
    return { sum }
  }
}
</script>

在这里插入图片描述

咦,怎么没有监听到啊?怎么回事啊!

其实很简单,只需要配置一个叫 deep 的属性为 true 即可,大家从单词就能看出来是 “深度” 的意思啊,看看这个配置写在哪里。

watch(() => sum.car, (New, Old) => {
 ...
}, { deep: true })

这回再看看,没问题,监听到了!

监听多个

前面我们知道了如何监听 ref 数据,如何监听 reactive 对象数据,也知道了如何监听嵌套比较深的复杂对象数据。

如果我有两个数据需要监听怎么办?

Vue3 给你提供了多个变量监听的语法,如下代码所示。

<template>
  <h2>one:{{ one }} | two: {{ two.value }}</h2>
  <button @click="one++">改变 one 数据</button>
  <button @click="two.value++">改变 two 数据</button>
</template>

<script>
import { watch, reactive, ref } from 'vue'
export default {
  setup() {
    
    // 变量1
    const one = ref(0)

    // 变量2
    const two = reactive({
      value: 10
    })

    // 监听多个变量
    // 第一个参数变为数组形式,每个下标对应一个要监听的变量
    // 第二个参数的函数传参改为每项数组形式,每个数组对应新旧值的参数
    watch(
      [ one, () => two.value ],
      ( [oneNew, oneOld], [twoNew, twoOld] ) => {
        console.log(`one: ${oneNew}(新) ——— ${twoNew}(旧)`)
        console.log(`two: ${oneOld}(新) ——— ${twoOld}(旧)`)
        console.warn('——————————————————————————————————————————————')
    })

    // return 
    return { one, two }
  }
}
</script>

在这里插入图片描述

可以看到啊,相比于之前的 Vue2 写法,这种写法虽然会随着监听的变量增多而增加复杂度,但是整体的话聚集在一起,很好维护。

有些看不太懂这个新旧值的一个对应关系,我们来分析一下啊。

在这里插入图片描述

咱们看变量 one,它的新旧值对应的是 oneNew / twoNew,而 tow 则对应的新旧值是 oneOldtwoOld,这个对应关系看起来有点反人类啊,大家仔细观察规律,多看多写几遍就明白了。

监听器是惰性的

在 Vue2/3 中 watch 是惰性的,啥意思呢,就是它比较懒,那怎么个懒法呢,就是当你写好 watch 监听后,它不会主动触发监听函数,而是当你数据改变时才触发。

如下示例:

<template>
  <button @click="sum++">增加数值</button>
</template>

<script>
import { watch, ref } from 'vue'
export default {
  setup() {
    
    // 响应式变量
    const sum = ref(1)

    // 懒惰的玩意
    watch(sum, () => {
      console.log('我触发啦!')
    })

    // return 
    return { sum }
  }
}
</script>

运行,可以看到,我刷新页面,它并不会触发监听函数,这就叫做惰性,控制台没有任何输出。

注意啊,重点来了,假如我就想初次进入页面的时候就让它执行,让它勤奋点,有什么办法能做到吗?

能!并且非常简单,只需要一个配置项即可。


我们来改造一下。

<template>
  <button @click="sum++">增加数值</button>
</template>

<script>
import { watch, ref } from 'vue'
export default {
  setup() {
    
    // 响应式变量
    const sum = ref(1)

    // 勤奋了
    watch(sum, () => {
      console.log('我触发啦!')
    }, { immediate: true })

    // return 
    return { sum }
  }
}
</script>

在这里插入图片描述

当我刷新页面的时候,马上就触发了,果然勤奋了!

停止监听

最后呢,我们来说一下 Vue3 独有的停止监听,啥意思呢,就是咱们可以手动控制 watch 是否继续对一个变量进行监听,随时让 watch 放弃对某个变量的后续监听。

在 Vue2 中是没有停止监听的功能,你回忆一下,当你写好监听后,watch 是不是会永远等待?是不是根本不存在关掉这一说?

Vue3 之所以提供了停止监听的方法,这是因为持续监听会占用内部资源,很可能咱们某个变量都不需要后续持续监听了,但又没有办法关掉。

说了这么多,我们来手动实现一下。

<template>
  <button @click="sum++">增加数值</button>
  <button @click="stop">停止监听</button>
</template>

<script>
import { watch, ref } from 'vue'
export default {
  setup() {
    
    // 响应式变量
    const sum = ref(1)

    // 想要支持停止监听,必须将watch结果用一个变量进行接收
    const result = watch(sum, () => {
      console.log('我触发啦!')
    })

    // 停止监听
    const stop = () => {
      // 写上接收的变量名即可
      result()
    }

    // return 
    return { sum, stop }
  }
}
</script>

在这里插入图片描述

很神奇。

SEO

Vue3官方文档,vue3.js watch 侦听器官方教程文档,vue3—watch侦听器总结太到位了,vue3 watch侦听器,详解Vue3中侦听器watch的使用教程,VUE3中watch监听使用实例详解,vue3—watch侦听器总结太到位了,Vue3侦听器watch,详解Vue3中侦听器watch的使用教程,Vue3 我对watch侦听器的理解,VUE3 中的 Watch 详解,Vue 3 响应式侦听与计算属性,Vue3 watch 和 watchEffect 侦听器,vue3.0中的watch侦听器实例详解,Vue3.xwatch函数—侦听器,Vue3 setup中watch监听器的使用,Vue选项:watch侦听器,一文搞懂Vue3中watch和watchEffect区别和用法,vue3 setup中watch监听的使用方法,Vue3 - watch 侦听器(超详细使用教程)。

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

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

相关文章

超实用Word小技巧,常用但很少有人记得住

我们在日常工作中经常使用 Word 进行办公。以下常用Word提示可以为您的工作节省时间和精力&#xff0c;让我们来看看。 技巧一&#xff1a;如何纵向复制文本我们一般水平选择文本&#xff0c;你有没有想过垂直选择文本&#xff1f;先按住【Alt】键&#xff0c;然后拖动鼠标左键…

【Python百日进阶-WEB开发】Day179 - Django案例:11短信验证码

文章目录九、短信验证码9.1 短信验证码逻辑分析9.2 容联云通讯短信平台9.2.1 容联云通讯短信平台介绍9.2.2 容联云通讯短信SDK测试9.2.2.1 美多商城meiduo_mall.apps.verifications.libs中新建yuntongxun包&#xff0c;结构如下&#xff1a;9.2.2.2 ccp_sms.py代码9.2.2.3 CCPR…

一起来庆祝属于GISer的节日GIS DAY!

01 概述 作为一名GISer的你&#xff0c;有没有想过其实我们GISer也有自己的节日&#xff1f;这个节日便是GIS DAY&#xff0c;今年的GIS DAY恰在今天&#xff08;2022年11月16日&#xff09;。究竟什么是GIS DAY&#xff1f;这里为大家介绍一下这个节日。 02 什么是GIS DAY …

vue的移动端项目打包成手机的app软件apk格式

目录 前提准备&#xff1a; 1、vue项目npm run build打包成dist文件夹 2、注册hbuilderx账号&#xff0c;获取appid 步骤 一、创建h5app空模版 二、 将打包完成生成dist文件目录复制到新建的项目里 三、检测打包的index.html是否白屏 四、 配置manifest.js应用入口页面…

作为项目经理必须具备的能力

作为项目管理者&#xff0c;每天都要应对项目中的所有问题&#xff0c;安排任务&#xff0c;还要照顾下属的情绪。管理者应该怎么做。 1、计划制定 项目经理作为项目管理者&#xff0c;需要制定计划&#xff0c;合理化分配任务。 项目经理可以使用甘特图制定项目计划&#xf…

微服务feign接口声明的3种方式使用与分析

前言 feign调用方式是微服务调用最为广泛的使用方式&#xff0c;feign接口声明位置也是比较关键的一环。目前来说&#xff0c;feign的3种接口声明方式各自存在利弊&#xff0c;并不存在最优解决方案&#xff0c;只能根据需求去选择。本文中不作详细项目搭建过程&#xff0c;但…

做3D建模的女生多吗?揭露行业比列

有&#xff0c;但是不多&#xff0c;这是常态✅ 其实就像是IT领域的男女比例一样&#xff0c;但是也不是没有。更何况现在女孩子顶半边天&#xff0c;遇到领导是女生的也不少&#xff0c;未来的情况如何也不能完全的预估。 • ❤️事业是热爱做的事&#xff0c;工作是不得不做…

索引【MySQL】

1.1 概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引&#xff0c; 并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。 1.2 作用 数据库中的表、数据、索引之间的关系&#xff0c;类似于书架上的图书、…

简洁直观解释精确率、召回率、F1 值、ROC、AUC

混淆矩阵 当我们在做二分类预测时&#xff0c;把预测情况与实际情况的所有结果两两混合&#xff0c;结果就会出现以下4种情况&#xff0c;就组成了混淆矩阵。 P&#xff08;Positive&#xff09;&#xff1a;代表正样本N&#xff08;Negative&#xff09;&#xff1a;代表负样…

在vscode中开发sass教程:sass语法

sass官网&#xff1a;Sass世界上最成熟、稳定和强大的CSS扩展语言 | Sass中文网sass&#xff1a;世界上最成熟、最稳定、最强大的专业级css扩展语言&#xff01;sass是一个css的预编译工具&#xff0c;也就是能够更优雅的书写css&#xff1b;1、sass使用说明&#xff1a; 基于…

【毕业设计】后端实现——账单通过关键词简单分析收支

&#x1f308;据说&#xff0c;看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。 前言&#xff1a; &#x1f9e1;作者简介&#xff1a;大家好我是 user_from_future &#xff0c;意思是 “ 来自未来的用户 ” &#xff0c;寓意着未来的自己一定很棒~ ✨个…

C++ STL中的set详解

前言 在学习csp题解的时候接触到这个数据结构&#xff0c;故在此记录一下其概念及应用。 基本概念 set的底层采用的是红黑树&#xff0c;所有元素都会根据元素的键值自动排序&#xff0c;方便管理元素&#xff0c;但不支持直接修改键值。 应用 头文件调用 #include <i…

python中is和==的区别,地址和重新复制后,地址变化

简单总结 现象描述&#xff1a;一、“编辑器“中和把赋值语句放在”同一行的cmd环境“中&#xff0c;相同值的不同变量会指向同一个地址 二、交互式/cmd环境中&#xff0c;若赋值相同值的变量在不同行输入&#xff0c;那么变量也会指向不同地址 三、程序编辑器的程序运行就相当…

B2B撮合管理系统优势有哪些?如何助力传统仪器仪表制造业企业数字化转型

仪器仪表制造业是我国制造业的重要组成部分&#xff0c;经过多年的快速发展&#xff0c;我国仪器仪表制造业生产和开发能力产业体系日趋庞大&#xff0c;产销增幅也是高歌猛进&#xff0c;对推动国民经济发展具有重要意义。 然而&#xff0c;随着我国仪器仪表制造业的发展&…

GAN模型1

本次是用GAN模型弄出时光机效果~ 穿越时空的人脸 得到你100年前的样子~~ 时光穿梭第一步&#xff1a;解决数据集难题 鉴于最近StyleGAN在高质量人脸合成和编辑方面的成功&#xff0c;许多工作都集中在使用预先训练好的StyleGAN模型进行人像编辑。 然而&#xff0c;现有的技术…

[附源码]计算机毕业设计JAVA儿童资源教育网站

[附源码]计算机毕业设计JAVA儿童资源教育网站 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

聚观365|抖音上线“防打扰保护工具”;亚马逊拟计划裁员1万人

今日要闻&#xff1a;抖音上线“防打扰保护工具”&#xff1b;亚马逊拟计划裁员1万人&#xff1b;苹果为iPhone14提供同机维修&#xff1b;美国硅谷裁员潮蔓延&#xff1b;乔布斯拖鞋拍卖融入NTF元素 抖音上线“防打扰保护工具” 11月15日&#xff0c;抖音上线“防打扰保护工具…

【数据结构与算法】第一章 绪论 2-数据结构的基本概念

第一章 绪论 2-数据结构的基本概念 思考&#xff1f; 程序 算法数据结构&#xff0c;算法 逻辑控制数据结构有两大用途&#xff1a; 一是用于存放要处理的数据&#xff0c;如迷宫地图二是用于实现算法策略&#xff0c;如迷宫例子中探索方向增量数组&#xff0c;回溯的栈&am…

如何深度自定义mybatis

回顾mybatis的操作的核心步骤 编写核心类SqlSessionFacotryBuild进行解析配置文件 深度分析解析SqlSessionFacotryBuild干的核心工作 编写核心类SqlSessionFacotry 深度分析解析SqlSessionFacotry干的核心工作 编写核心类SqlSession 深度分析解析SqlSession干的核心工作 …

物联网电池产品硬件电路设计思维

最近在整改之前工程师设计的电路板&#xff0c;是采用18650电池供电的一个物联网小板。 像这种电池供电的产品&#xff0c;很重要的一点就是要保证其低功耗&#xff0c;才得以提高续航&#xff0c;因此&#xff0c;对于这类电路板的对外接口的设计&#xff0c;对供电的控制尤其…