Vue3——Watch侦听器

news2025/5/17 5:26:06

目录

手动指定监听对象

侦听ref对象

侦听ref对象中的某个属性

reactive写法 

watchEffect 自动侦听

多源侦听

一次性侦听器


        watch 是⼀个⽤于观察和响应Vue响应式系统中数据变化的⽅法。它允许你指定⼀个数据源(可以是 响应式引⽤、计算属性、组件的属性等),当这个数据源的值发⽣变化时,你可以执⾏⼀些响应的副作⽤。 watch 可以⽤来监听任何响应式数据的变化。

手动指定监听对象

基础语法:

import { watch, ref } from 'vue'

const count = ref(0)

// 监听单个 ref
watch(count, (newVal, oldVal) => {
  console.log(`计数器变化:${oldVal} → ${newVal}`)
})

// 立即执行版
watch(count, callback, { immediate: true })

侦听ref对象

  <div id="app">
    <select v-model="a">
      <option value="10">学生</option>
      <option value="12">老师</option>
      <option value="14">教务</option>
      <option value="16">管理员</option>
    </select>
  </div>

  <script type="module">
    import { createApp, ref, reactive, watch } from '/vue.esm-browser.js'
    createApp({
      setup() {
        const a = ref("")
        watch(a, (a, b) => {
          console.log(a + "-------" + b);
        })
        return {
          a,
        }
      }
    }).mount("#app")
  </script>

如果匿名函数只有一个参数,则这个参数代表新值。

watch(a, (a) => {

          console.log(a);

        })


侦听ref对象中的某个属性

 <div id="app">
    <select v-model="a.msg">
      <option value="10">学生</option>
      <option value="12">老师</option>
      <option value="14">教务</option>
      <option value="16">管理员</option>
    </select>
    {{a}}
  </div>

  <script type="module">
    import { createApp, ref, reactive, watch } from '/vue.esm-browser.js'
    createApp({
      setup() {
        const a = ref({
          msg: "",
          obj: ""
        })
        watch(() => a.value.msg, (a, b) => {
          console.log(a + "-------" + b);
        })
        return {
          a,
        }
      }
    }).mount("#app")
  </script>

注意:参数绑定的是a.msg,监听的观察要写成() => a.value.msg

reactive写法 

  <script type="module">
    import { createApp, ref, reactive, watch } from '/vue.esm-browser.js'
    createApp({
      setup() {
        const a = reactive({
          msg: "",
          obj: ""
        })
        watch(() => a.msg, (a, b) => {
          console.log(a + "-------" + b);
        })
        return {
          a,
        }
      }
    }).mount("#app")
        const z = reactive({
          msg: 0
        })
    
        watch(z, (n, o) => {
          console.log(n.msg + '---' + o.msg);

        })

注意:`newValue` 此处和 `oldValue` 是相等的,因为它们是同一个对象

watchEffect 自动侦听

    watchEffect会自动收集所有的依赖,在满足某个条件时执行。默认情况下会立即执行一次

    watchEffect() 的好处相对较小。但是对于有多个依赖项的侦听器来说,使用 watchEffect() 可以消除手动维护依赖列表的负担。此外,如果你需要侦听一个嵌套数据结构中的几个属性,watchEffect() 可能会比深度侦听器更有效,因为它将只跟踪回调中被使用到的属性,而不是递归地跟踪所有的属性。

<div id="app">
    <select v-model="a.msg">
      <option value="10">学生</option>
      <option value="12">老师</option>
      <option value="14">教务</option>
      <option value="16">管理员</option>
    </select>
    {{a}}
  </div>

  <script type="module">
    import { createApp, ref, reactive, watch, watchEffect } from '/vue.esm-browser.js'
    createApp({
      setup() {
        const a = reactive({
          msg: "1",
          obj: ""
        })

        watchEffect(() => {
          console.log("监听开始");
          if (a.msg == 10) {
            console.log("学生");
          }
          if (a.msg == 12) {
            console.log("老师");
          }
          if (a.msg == 14) {
            console.log("教务");
          }
          console.log("end");

        })

        return {
          a,
        }
      }
    }).mount("#app")

多源侦听

    根据vue的官方文档,发现watch可以侦听多个数据(数组形式),当这个数组中有一个值发生变化,就会执行一次回调函数。

值得一提的是,y 是一个 ref,所以直接使用 y 而不是 () => y.value。

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

        watch([x, y], ([xn, yn], [xo, yo]) => {
          console.log(`新值${xn},${yn}`);
          console.log(`旧值${xo},${yo}`);
        })

 

一次性侦听器

注:该功能仅支持 3.4 及以上版本

每当被侦听源发生变化时,侦听器的回调就会执行。如果希望回调只在源变化时触发一次,可以使用once:true

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

const z = reactive({
          msg: 0
        })
watch(z, (n, o) => {
          console.log(n.msg + '---' + o.msg);

        },
          { once: true }
        )

 这样无论侦听源变换多少次,侦听器都只会执行一次。

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

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

相关文章

Go的单测gomock及覆盖率命令

安装gomock&#xff1a; go get github.com/golang/mock/gomockgo get github.com/golang/mock/mockgen 使用 mockgen 生成 mock 代码: 参考 mockgen -sourceservice/user.go -destinationservice/mocks/mock_user_service.go -packagemocks go test -coverprofilecoverage.out…

Leetcode209做题笔记

力扣209 题目分析&#xff1a;想象一个窗口遍历着这个数组&#xff0c;不断扩大右边界&#xff0c;让r。往窗口中添加数字&#xff1a; 此时我们找到了这个窗口&#xff0c;它的和满足了大于等于target的条件&#xff0c;题目让我求最短的&#xff0c;那么我们就尝试来缩短它&…

Suna: 开源多面手 AI 代理

GitHub&#xff1a;GitHub - kortix-ai/suna: Suna - Open Source Generalist AI Agent 更多AI开源软件&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI Suna 是一个完全开源的 AI 助手&#xff0c;可帮助您轻松完成实际任务。通过自然对话&#xff0c…

25-05-16计算机网络学习笔记Day1

深入剖析计算机网络&#xff1a;今日学习笔记总结 本系列博客源自作者在大二期末复习计算机网络时所记录笔记&#xff0c;看的视频资料是B站湖科大教书匠的计算机网络微课堂&#xff0c;每篇博客结尾附书写笔记(字丑见谅哈哈) 视频链接地址 一、计算机网络基础概念 &#xf…

12 web 自动化之基于关键字+数据驱动-反射自动化框架搭建

文章目录 一、如何实现一条用例&#xff0c;实现覆盖所有用例的测试1、结合数据驱动&#xff1a;编辑一条用例&#xff0c;外部导入数据实现循环测试2、用例体&#xff1a;实现不同用例的操作步骤对应的断言 二、实战1、项目路径总览2、common 文件夹下的代码文件3、keywords 文…

动态IP赋能业务增效:技术解构与实战应用指南

在数字化转型加速的今天&#xff0c;IP地址作为网络通信的基础设施&#xff0c;其技术特性正深刻影响着企业业务架构的效率与安全性。动态IP&#xff08;Dynamic IP&#xff09;作为互联网资源分配的核心机制&#xff0c;早已突破传统认知中的"临时地址"定位&#xf…

【Java ee初阶】http(1)

HTTP 全称为“超文本传输协议”&#xff0c;由名字可知&#xff0c;这是一个基于文本格式的协议&#xff0c;而TCP&#xff0c;UDP&#xff0c;以太网&#xff0c;IP...都是基于二进制格式的协议。 如何区别该协议是基于哪种格式的协议&#xff1f; 形如这种协议格式&#xf…

day18-数据结构引言

一、 概述 数据结构&#xff1a;相互之间存在一种或多种特定关系的数据元素的集合。 1.1 特定关系&#xff1a; 1. 逻辑结构 2.物理结构&#xff08;在内存当中的存储关系&#xff09; 逻辑结构物理结构集合&#xff0c;所有数据在同一个集合中&#xff0c;关系平等顺…

我开源了一个免费在线工具!UIED Tools

UIED Tools - 免费在线工具集合 最近更新&#xff1a;修改了文档说明&#xff0c;优化了项目结构介绍 这是设计师转开发的第一个开源项目&#xff0c;bug和代码规范可能有些欠缺。 这是一个功能丰富的免费在线工具集合网站&#xff0c;集成了多种实用工具&#xff0c;包括 AI …

什么时候可以开始学习深度学习?

咱们先来聊聊机器学习和深度学习的关系~ 这个问题其实挺常见的&#xff0c;之前我也跟不少同事、同学聊过。最近有好几个同学也聊过。 简单说&#xff0c;深度学习是机器学习的一个子集&#xff0c;两者不是并列关系&#xff0c;而是“包含”关系。 你可以这么理解&#xff…

初学python的我开始Leetcode题8-5

提示&#xff1a;100道LeetCode热题-8-5主要是二叉树相关&#xff0c;包括三题&#xff1a;路径总和 III、二叉树的最近公共祖先、二叉树中的最大路径和。由于初学&#xff0c;所以我的代码部分仅供参考。 前言 二叉树完结撒花~ 下一次的图论会是一些有趣的应用案例~ 提示&am…

构建RAG混合开发---PythonAI+JavaEE+Vue.js前端的实践

写在前文&#xff1a;之所以设计这一套流程&#xff0c;是因为 Python在前沿的科技前沿的生态要比Java好&#xff0c;而Java在企业级应用层开发比较活跃&#xff1b; 毕竟许多企业的后端服务、应用程序均采用Java开发&#xff0c;涵盖权限管理、后台应用、缓存机制、中间件集成…

08.webgl_buffergeometry_attributes_none ,three官方示例+编辑器+AI快速学习

本实例主要讲解内容 这个Three.js示例展示了无属性几何体渲染技术&#xff0c;通过WebGL 2的gl_VertexID特性和伪随机数生成算法&#xff0c;在着色器中动态计算顶点位置和颜色&#xff0c;而不需要在CPU端预先定义几何体数据。 核心技术包括&#xff1a; WebGL 2的顶点ID特…

26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述

26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述 文章目录 26考研 | 王道 | 计算机组成原理 | 一、计算机系统概述1.1 计算机的发展1.2 计算机硬件和软件1.2.1 计算机硬件的基本组成1.2.2 各个硬件的工作原理1.2.3 计算机软件1.2.4 计算机系统的层次结构1.2.5 计算机系统…

LeetCode100.2 字母异位词分组

观察题目&#xff0c;需要把strs中的元素按照字母进行归类&#xff0c;一个朴素的思路是&#xff1a;遍历strs&#xff0c;对每个元素排序后插入哈希表中&#xff0c;随后再遍历一遍表将其转化为vector<vector<string>>。 class Solution { public:vector<vect…

显示的图标跟UI界面对应不上。

图片跟UI界面不符合。 要找到对应dp的值。UI的dp要跟代码里的xml文件里的dp要对应起来。 蓝湖里设置一个宽度给对应上。然后把对应的值填入xml. 一个屏幕上的图片到底是用topmarin来设置&#xff0c;还是用bottommarin来设置。 因为第一节&#xff0c;5&#xff0c;7 车厢的…

高并发内存池(三):TLS无锁访问以及Central Cache结构设计

目录 前言&#xff1a; 一&#xff0c;thread cache线程局部存储的实现 问题引入 概念说明 基本使用 thread cache TLS的实现 二&#xff0c;Central Cache整体的结构框架 大致结构 span结构 span结构的实现 三&#xff0c;Central Cache大致结构的实现 单例模式 thr…

在Taro中开发一个跨端Svg组件,同时支持小程序、H5、React Native

Taro系列中一直没有跨端的绘图工具&#xff0c;小程序端支持canvas但是不支持svg&#xff0c;RN端有 react-native-svg 支持svg&#xff0c;但是没有很好原生的canvas插件&#xff0c;社区的canvas都是基于WebView实现的&#xff0c;或者skia&#xff0c;这个插件的书写方式和c…

【办公类-100-01】20250515手机导出教学照片,自动上传csdn+最大化、最小化Vs界面

背景说明&#xff1a; 每次把教学照片上传csdn&#xff0c;都需要打开相册&#xff0c;一张张截图&#xff0c;然后ctrlV黏贴到CSDN内&#xff0c;我觉得太烦了。 改进思路&#xff1a; 是否可以先把所有照片都上传到csdn&#xff0c;然后再一张张的截图&#xff08;去掉幼儿…

Python零基础入门到高手8.4节: 元组与列表的区别

目录 8.4.1 不可变数据类型 8.4.2 可变数据类型 8.4.3 元组与列表的区别 8.4.4 今天彩票没中奖 8.4.1 不可变数据类型 不可变数据类型是指不可以对该数据类型进行原地修改&#xff0c;即只读的数据类型。迄今为止学过的不可变数据类型有字符串&#xff0c;元组。 在使用[]…