Vue3 学习笔记(十二)侦听器详解

news2024/11/23 22:15:02

在 Vue 3 中,侦听器是一种响应式特性,允许你观察和响应 Vue 实例上的数据变动。Vue 提供了 watchwatchEffect 两个函数来创建侦听器。


1、watch 侦听器


watch 是一个用于侦听特定数据源变化的函数。它允许你指定一个或多个数据源,并在这些数据源变化时执行回调函数。watch 通常用于侦听响应式状态的变化,并在变化发生时执行副作用。

特点

  • 懒执行watch 只有在被侦听的响应式数据变化时才会执行回调函数。
  • 精确侦听:你可以精确指定要侦听的数据源,watch 会确保只有在这些数据源变化时才触发回调。
  • 可停止watch 返回一个停止侦听的函数,你可以在需要时停止侦听。

(1)、基本用法

<script setup>
import { ref, watch } from 'vue';

const state = ref(0);
const newstate = ref(0);
const oldtate = ref(0);

// 创建侦听器
watch(() => state.value, (newValue, oldValue) => {
     newstate.value =  newValue;
     oldtate.value =  oldValue;
});


// 定义事件处理函数
    function handleClick() {
        state.value = 10
    }

</script>

<template>

  <span> Selected: {{ newstate + "/"  + oldtate}}</span>

  <button @click="handleClick">Click me</button>


</template>



这段代码演示了如何在 Vue 3 中使用 <script setup> 语法来创建响应式状态和侦听器。当状态 state 发生变化时,侦听器会更新 newstateoldtate 的值,并且在模板中显示这些变化。点击按钮会触发 handleClick 函数,该函数更新 state 的值,从而触发侦听器的回调函数。

(2)、侦听多个源

<script setup>
import { ref, watch } from 'vue';


const firstName = ref('John');
const lastName = ref('Doe');

const firstNewName = ref('John');
const lastnewName = ref('Doe');


watch([firstName, lastName], ([newFirstName, newLastName], [oldFirstName, oldLastName]) => {
  console.log(`Name changed from ${oldFirstName} ${oldLastName} to ${newFirstName} ${newLastName}`);

     firstNewName.value =  newFirstName;
     lastnewName.value =  newLastName;
});


// 定义事件处理函数
    function handleClick() {
        firstName.value ='111111'
        lastName.value ='222222'
    }

</script>

<template>

  <span> Selected: {{ firstNewName  + "/"  + lastnewName}}</span>
  <p> </p>
  <button @click="handleClick">Click me</button>


</template>




点击按钮前:

在这里插入图片描述


点击按钮后:

在这里插入图片描述


(3)、侦听数据源类型


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}`)
})

(4) 、一次性侦听器

  • 仅支持 3.4 及以上版本

每当被侦听源发生变化时,侦听器的回调就会执行。

如果希望回调只在源变化时触发一次,请使用 once: true 选项。

watch(
  source,
  (newValue, oldValue) => {
    // 当 `source` 变化时,仅触发一次
  },
  { once: true }
)

2、watchEffect 侦听器


watchEffect 是一个用于侦听多个响应式数据源变化的函数。它立即执行回调函数,并在其依赖的响应式数据变化时重新执行。

特点

  • 即时执行watchEffect 在创建时立即执行回调函数,而不仅仅是在依赖的数据变化时。

  • 依赖跟踪watchEffect 会自动追踪其回调函数中使用的所有响应式数据。

  • 自动清理watchEffect 在组件卸载时自动停止侦听,无需手动停止。

<script setup>
import { ref, watchEffect } from 'vue';


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

const xNewsum = ref(0);

// 创建侦听器
watchEffect(() => {
   xNewsum.value = x.value +  y.value ;
});


// 定义事件处理函数
    function handleClick() {
        x.value =134
        y.value =134
    }

</script>

<template>

  <span> xNewsum: {{ xNewsum}}</span>
  <p> </p>
  <button @click="handleClick">Click me</button>


</template>


启动时, 立即执行:

在这里插入图片描述


当点击按钮后,更新数据:

在这里插入图片描述


3 、选择 watch 还是 watchEffect

  • 如果你需要在数据变化时执行副作用,并且希望副作用只在数据变化时触发,使用 watch

  • 如果你需要立即执行副作用,并且副作用依赖于多个响应式数据源,使用 watchEffect

  • 如果你的副作用逻辑较为简单,或者你希望副作用能够立即执行,watchEffect 可能是更好的选择。

  • 如果你需要更精细的控制副作用的执行时机,或者你需要在副作用执行前后进行额外的操作,watch 可能更适合你的需求。


(1)、watch 的应用场景

侦听特定数据源的变化

当你需要在特定的响应式数据变化时执行操作,比如表单验证、数据转换或者条件渲染。

import { ref, watch } from 'vue';

const username = ref('');

watch(username, (newValue, oldValue) => {
  if (newValue !== oldValue) {
    console.log(`Username changed from ${oldValue} to ${newValue}`);
  }
});

条件渲染

当你需要根据数据的变化来决定是否执行某些操作,例如,只有在某个条件满足时才执行副作用。

import { ref, watch } from 'vue';

const isPremiumUser = ref(false);

watch(isPremiumUser, (newStatus) => {
  if (newStatus) {
    console.log('User is now a premium user');
  }
});

依赖多个数据源

当你需要侦听多个数据源,并在任何一个数据源变化时执行操作。

import { ref, watch } from 'vue';

const firstName = ref('');
const lastName = ref('');

watch([firstName, lastName], ([newFirstName, newLastName], [oldFirstName, oldLastName]) => {
  console.log(`Name changed from ${oldFirstName} ${oldLastName} to ${newFirstName} ${newLastName}`);
});

(2)、watchEffect 的应用场景

立即执行副作用

当你需要在组件初始化时立即执行副作用,并且副作用依赖于多个响应式数据源。

import { ref, watchEffect } from 'vue';

const count = ref(0);

watchEffect(() => {
  console.log(`Count is now ${count.value}`);
});

复杂的依赖跟踪

当你的副作用依赖于多个响应式数据源,并且这些依赖关系在副作用函数中不明显时。

import { ref, computed, watchEffect } from 'vue';

const firstName = ref('');
const lastName = ref('');

const fullName = computed(() => `${firstName.value} ${lastName.value}`);

watchEffect(() => {
  console.log(`Full name is now ${fullName.value}`);
});

自动清理副作用

当你需要在副作用中设置事件监听器或其他需要清理的资源,并且希望这些资源在组件卸载时自动清理。

import { onMounted, onUnmounted, watchEffect } from 'vue';

watchEffect(() => {
  const handleResize = () => {
    console.log('Window resized');
  };

  window.addEventListener('resize', handleResize);

  onUnmounted(() => {
    window.removeEventListener('resize', handleResize);
  });
});

```<br/>

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

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

相关文章

#渗透测试#SRC漏洞挖掘# 信息收集-常见端口及谷歌语法

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

SAP ABAP开发学习——第一代增强(包含增强演示)

​​​​​​SAP ABAP开发学习——第二代增强&#xff08;包含增强演示&#xff09;-CSDN博客 SAP ABAP开发学习——第三代增强&#xff08;BADI)-CSDN博客 概念 第一代增强(增强嵌入标准程序中) 第一代出口-User exit 以SD用户出口为例 SD及MM较多的程序都是基于源码控制来…

安宝特分享 | AR技术引领:跨国工业远程协作创新模式

在当今高度互联的工业环境中&#xff0c;跨国合作与沟通变得日益重要。然而&#xff0c;语言障碍常常成为高效协作的绊脚石。安宝特AR眼镜凭借其强大的多语言自动翻译和播报功能&#xff0c;正在改变这一局面&#xff0c;让远程协作变得更加顺畅。 01 多语言翻译优势 安宝特A…

动态规划 01背包(算法)

现有四个物品&#xff0c;小偷的背包容量为8&#xff0c;怎么可以偷得价值较多的物品 如: 物品编号&#xff1a; 1 2 3 4 物品容量&#xff1a; 2 3 4 5 物品价值&#xff1a; 3 4 5 8 记f(k,w) ,当背包容量为w,可以偷k件物品…

AWD挨打记录

前言 昨天参加了星盟的AWD集训&#xff0c;本来寻思能猛猛乱杀&#xff0c;结果加固时间只有20分钟&#xff0c;WAF还没push上去就被三家上了不死马QAQ cms是站帮主&#xff0c;之前没打过&#xff0c;D盾啥也没扫出来&#xff0c;还寻思是个贼安全的系统&#xff0c;结果洞满…

InstructIR: High-Quality Image Restoration Following Human Instructions 论文阅读笔记

这是Radu大佬所在的Wrzburg大学的computer vision lab实验室发表在ECCV2024上的一篇论文&#xff0c;代码开源。文章提出了一种文本引导的All-in-One的restoration模型&#xff0c;如下图所示&#xff1a; 这个工作其实跟"InstructPix2Pix: Learning to Follow Image Edit…

libavdevice.so.58: cannot open shared object file: No such file ordirectory踩坑

博主是将大图切分成小图时遇到 问题一、linux编译后&#xff0c;找不到ffmpeg中的一个文件 产生原因&#xff0c;各种包集成&#xff0c;然后安装以后乱七八糟&#xff0c;甚至官方的教程也不规范导致没有添加路径到系统文件导致系统执行的时候找不到 1.下载 博主进行的离线…

【SQL实验】表的更新和简单查询

完整代码在文章末尾 在上次实验创建的educ数据库基础上&#xff0c;用SQL语句为student表、course表和sc表中添加以下记录 【SQL实验】数据库、表、模式的SQL语句操作_创建一个名为educ数据库,要求如下: (下面三个表中属性的数据类型需要自己设计合适-CSDN博客在这篇博文中已经…

UHF机械高频头的知识和待学习的疑问

电路图如上所示&#xff1a; 实物开盖清晰图如下&#xff1a; 待学习和弄懂的知识&#xff1a; 这是一个四腔的短路线谐振。分别是输入调谐&#xff0c;放大调谐&#xff0c;变频调谐和本振 第一个原理图输入为75欧&#xff08;应该是面向有同轴线的天线了&#xff09;如下图…

学习路之TP6--workman安装

一、安装 首先通过 composer 安装 composer require topthink/think-worker 报错&#xff1a; 分析&#xff1a;最新版本需要TP8&#xff0c;或装低版本的 composer require topthink/think-worker:^3.*安装后&#xff0c; 增加目录 vendor\workerman vendor\topthink\think-w…

【三十八】【QT开发应用】vlcplayer视频播放器(一)实现视频播放,视频暂停,视频停止,进度条调节,音量调节,时长显示功能

效果展示 vlcplayer_test视频播放器 MainWidget.ui 注意控件的布局和命名&#xff0c;控件的命名和信号与槽函数的绑定有关&#xff0c;所以这点很重要。 下载VLC组件和环境配置 videolan下载地址我下载的是vlc-3.0.8-win64版本. 将下载的文件复制粘贴到项目文件中. 复制粘…

5G NR NARFCN计算SSB中心频率MATLAB实现

本期给大家带来5G NR中已知绝对射频信道号NARFCN如何计算SSB的中心频率&#xff0c;用MATLAB实现&#xff0c;参考3GPP 38.104 下图是NARFCN与SSB中心频率换算关系&#xff0c;其中NREF就是NARFCN。 函数输出频率的单位是MHZ&#xff0c;输入是NARFCN。 有不清楚的地方欢迎来…

auto 项目笔记

基础设置 1.设置python目录为根路径 1. merge_with_history debug (1) coomon.yaml 修改 最下边的 root: /mnt/sdb/daimler/EHPV2/Ruiming_InternalDaily (2) 环境变量设置为1时 不走此步骤做的任何处理&#xff0c;直把上步数据接透传出去 2.

深度学习(九):推荐系统的新引擎(9/10)

一、深度学习与推荐系统的融合 深度学习在推荐系统中的融合并非偶然。随着互联网的飞速发展&#xff0c;数据量呈爆炸式增长&#xff0c;传统推荐系统面临着诸多挑战。例如&#xff0c;在处理大规模、高维度的数据时&#xff0c;传统方法往往显得力不从心。而深度学习以其强大的…

如何建立测试团队的知识库

后台有同学留言&#xff0c;问了这样一个问题&#xff1a; 刚担任测试负责人&#xff0c;团队流程很乱&#xff0c;需求不甚明确&#xff0c;测试工作基本靠员工的熟练程度&#xff0c;项目交付质量堪忧。 迭代排期紧张&#xff0c;新招来的同学没人带&#xff0c;也没有文档之…

Spring 框架环境搭建

一、环境要求 JDK版本&#xff1a; JDK1.7及以上版本 Spring版本&#xff1a; Spring5.x版本 二、新建Maven项目 1. 创建 Maven 的普通 Java 项⽬ 2.设置项目坐标 3.设置项目的Maven环境 4.设置项目的名称和存放的工作空间 三、调整项目环境 1.修改JDK版本 properties&g…

[Wireshark] 使用Wireshark抓包https数据包并显示为明文、配置SSLKEYLOGFILE变量(附下载链接)

前言 wireshark安装包 链接&#xff1a;https://pan.quark.cn/s/febb28f57c01 提取码&#xff1a;fUCQ 链接失效&#xff08;可能会被官方和谐&#xff09;可评论或私信我重发 chrome与firefox在访问https网站的时候会将密钥写入这个环境变量SSLKEYLOGFILE中&#xff0c;在wir…

高考相关 APP 案例分享

文章首发于https://qdgithub.com/article/2032 一、核心内容 &#xff08;一&#xff09;高考相关 APP 案例 圈友朱康分享高考相关的 APP。提到猿题库&#xff0c;其主要功能有练习册和猿辅导&#xff0c;都是收费的。猿题库出题给学生练习&#xff0c;将易错的总结起来出练习…

【postman】工具下载安装

postman作用 postman用于测试http协议接口&#xff0c;无论是开发, 还是测试人员, 都有必要学习使用postman来测试接口, 用起来非常方便。 环境安装 postman 可以直接在chrome 上安装插件&#xff0c;当然大部分的同学是没法连接到谷歌商店的&#xff0c;我们可以在电脑本地…

【C++】 string的了解及使用

标准库中的string类 在使用string类时&#xff0c;必须包含#include头文件以及using namespace std; string类的常用接口说明 C中string为我们提供了丰富的接口来供我们使用 – string接口文档 这里我们只介绍一些常见的接口 string类对象的常见构造 #include <iostrea…