vue3学习(四)--- watch和watchEffect监听

news2024/9/24 11:29:46

文章目录

  • watch
    • source侦听源不同类型
      • 侦听ref
      • 侦听reactive
      • 侦听没有响应式的数据
      • 侦听多个源
  • watchEffect
    • 清除副作用
    • 清除侦听
    • flush用法

watch

watch() 默认是懒侦听的初始化不触发,只有在侦听源发生变化时才执行回调函数。

watch的结构:

  • source 侦听源
  • callback 回调函数
  • options 额外参数
    1. immediate:在侦听器创建时立即触发回调。第一次调用时旧值是 undefined
    2. deep:如果源是对象,强制深度遍历,以便在深层级变更时触发回调
    3. flush:调整回调函数的刷新时机
    4. onTrack / onTrigger:调试侦听器的依赖(可以在里面debugger等操作)
function watch<T>(
  source: WatchSource<T>, 
  callback: WatchCallback<T>,
  options?: WatchOptions
): StopHandle

source侦听源不同类型

这个来源可以是以下几种:

  • 一个 ref
  • 一个reactive
  • 一个函数,返回一个值
  • 或是由以上类型的值组成的数组

侦听ref

let num = ref(20)

//  基础类型 watch(要监听的响应式数据,回调(new,old))
watch(num, (newval, oldval) => {
  console.log(newval, oldval)
})

侦听reactive

使用reactive监听深层对象开启和不开启deep 效果一样

import { ref, watch ,reactive} from 'vue'
 
let message = reactive({
    nav:{
        bar:{
            name:""
        }
    }
})
watch(message, (newVal, oldVal) => {
    console.log('新的值----', newVal);
    console.log('旧的值----', oldVal);
})

侦听没有响应式的数据

当我们像侦听到ref/reactive里面属性时,由于不是响应式的原因直接侦听是没有效果的。
watch对这种数据做了处理,用函数返回的形式对数据进行监听
源码讲解点这里

import { ref, watch ,reactive} from 'vue'
 
let message = reactive({
    name:"",
    name2:""
}) 
watch(()=>message.name, (newVal, oldVal) => {
    console.log('新的值----', newVal);
    console.log('旧的值----', oldVal);
})

由于是因为不是响应式数据才需要用函数返回的形式。那么我们也可以将数据转为响应式的比如下面的写法:

import { ref, watch ,reactive} from 'vue'
 
let message = reactive({
    name:"",
    name2:""
}) 
watch(toRef(message,'name'), (newVal, oldVal) => {
    console.log('新的值----', newVal);
    console.log('旧的值----', oldVal);
})

侦听多个源

第一种就是可以分开创建多个watch侦听

import { ref, watch ,reactive} from 'vue'
 
let message = ref('')
let message2 = ref('')
 
watch(message, (newVal, oldVal) => {
    console.log('新的值----', newVal);
    console.log('旧的值----', oldVal);
})

watch(message2, (newVal, oldVal) => {
    console.log('新的值----', newVal);
    console.log('旧的值----', oldVal);
})

第二种就是以数组的形式进行侦听,同样回调返回的结果也是以数组的形式展现的。

import { ref, watch ,reactive} from 'vue'
 
let message = ref('')
let message2 = ref('')
 
watch([message,message2], (newVal, oldVal) => {
    console.log('新的值----', newVal);
    console.log('旧的值----', oldVal);
})

watchEffect

立即运行一个函数,同时响应式地追踪其依赖,并在依赖更改时重新执行。
如果用到message 就只会监听message 就是用到几个监听几个 而且是非惰性 会默认调用一次

// 页面进入立即触发监听
watchEffect(() => {
  // 凡是写在这里的数据,只要发生改变 都会触发这里的代码
  console.log(' objRea.num', objRea.num)
  if (objRea.num > 31) {
    objRea.num = 0
  }
})

清除副作用

就是在触发监听之前会调用一个函数可以处理你的逻辑

import { watchEffect, ref } from 'vue'
let message = ref<string>('')
let message2 = ref<string>('')
 watchEffect((oninvalidate) => {
    console.log('message', message.value);
    console.log('message2', message2.value);
    oninvalidate(()=>{
        console.log('初始化不触发,只有数据发生变化的时候才触发,触发的机制始终是最前的,oninvalidate不管放在哪个位置都会在message message2打印之前触发')
    })

})

清除侦听

import { watchEffect, ref } from 'vue'
let message = ref<string>('')
let message2 = ref<string>('')

const stop = watchEffect((oninvalidate) => {
    console.log('message', message.value);
    console.log('message2', message2.value);
    oninvalidate(()=>{
        console.log('初始化不触发,只有数据发生变化的时候才触发,触发的机制始终是最前的,oninvalidate不管放在哪个位置都会在message message2打印之前触发')
    })
})

合理的位置调用stop 停止侦听
stop()

flush用法

上面提到的option额外参数在watchEffect中同样适用,flush参数更适合用在watchEffect中。

flush默认是pre,主要区别在于侦听器的更新时间,一般会选择使用post 在组件更新后执行。这时候dom都已经更新完成了。
在这里插入图片描述


import { watchEffect, ref } from 'vue'
let message = ref<string>('')
let message2 = ref<string>('')
 watchEffect((oninvalidate) => {
   	let ele = document.querySelector('#aaa'); 这里拿到的是dom节点 所以说flush最好使用post在更新后执行
    console.log('message2', message2.value);
},{
    flush:"post",
    onTrigger () {
        
    }

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

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

相关文章

pandas-进阶

apply、transform 分组聚合agg

电商API接口:数据分析,代购商城建站,erp系统商品数据选品,价格监控,品牌维权,商家搬货,店铺铺货

淘宝&#xff08;1688拼多多京东等&#xff09;商品详情API接口&#xff08;item_get-获得taobao商品详情接口&#xff09;&#xff0c;淘宝API接口可获取到商品链接&#xff0c;商品ID&#xff0c;商品标题&#xff0c;商品价格&#xff0c;品牌名称&#xff0c;店铺昵称&…

基于图像识别的迁移学习之一

案例分析 加载数据部分同上一个案例&#xff0c;只需把数据输入到预训练的VGG-16或者ResNet50中。VGG-16的网络结构为右侧图绿色栏所示&#xff0c;其中block1中有2个包含64个卷积核的卷积层&#xff0c;block2包含2个128个卷积核的卷积层&#xff0c;block3有3个包含256个卷积…

SSH Tunneling隧道 - 探究与实践

1.应用场景 主要用于探究与实践SSH Tunneling隧道技术, 在日常开发中能到得心应手,提高工作效率. 2.学习/操作 1.文档阅读 chatgpt & 其他资料 Results for SSH tunneling [medium.com] The power of SSH tunneling. How it can make your developer life easier Connect…

华为、小鹏大定爆单,智驾苦尽甘来,车主终于愿意买单

‍作者|德新 编辑|王博 国庆假期结束&#xff0c;车圈的最大热点事件&#xff0c;当属问界M7卖爆&#xff0c;上市不到一个月时间内&#xff0c;狂揽5万张大定订单。 在华为手机强势回归&#xff0c;改款问界M7大热的高光之下&#xff0c;还有一个重要趋势值得关注&#xff1…

Java程序员要掌握vue2知识

1. Vue 基础 1) 环境准备 安装脚手架 npm install -g vue/cli-g 参数表示全局安装&#xff0c;这样在任意目录都可以使用 vue 脚本创建项目 创建项目 vue ui使用图形向导来创建 vue 项目&#xff0c;如下图&#xff0c;输入项目名 选择手动配置项目 添加 vue router 和 …

计算机网络面试知识点

计算机网络面试知识点 OSI七层模型 为什么网络分层 各层之间相互独立&#xff1b;任务细分&#xff0c;大事化小&#xff1b;提高整体灵活性&#xff1b; TCP/IP TCP面向连接&#xff0c;确认应答机制和超时重传机制&#xff1b;滑动窗口、TCP流量控制、拥塞控制机制实现流…

软件测试工具有什么作用?有哪些好用的测试工具推荐?

软件测试工具是现代软件测试中不可或缺的重要组成部分&#xff0c;指的是一系列在软件开发过程中使用的工具&#xff0c;用于帮助测试人员进行测试活动&#xff0c;提高测试效率&#xff0c;减少测试成本。选择并使用合适的软件测试工具&#xff0c;可提高软件质量和效率。 一…

QT作业三

1、思维导图 https://www.zhixi.com/view/9e899ee0 2、作业 #include <iostream>using namespace std;class Per { private:string name;int age;int *h;int *w; public://构造函数Per(string name,int age,int h,int w):name(name),age(age),h(new int (h)),w(new int…

UI自动化怎么做?不会代码能不能做

UI自动化测试是一种通过编写脚本或使用自动化测试工具对用户界面&#xff08;UI&#xff09;进行自动化测试的方法。它可以模拟用户与应用程序或网站的交互&#xff0c;自动化执行用户界面上的操作&#xff0c;如点击按钮、输入文本、选择选项等&#xff0c;并检查应用程序或网…

Node18.x进阶使用总结(四)

Node18.x进阶使用总结之MongoDB7.x 1、接口1.1、接口的组成1.2、RESTful API1.3、json-server1.4、接口测试工具1.4.1、apipost1.4.2、apifox1.4.3、postman 2、会话2.1、cookie2.1.1、特点2.1.2、cookie的运行流程2.1.3、cookie的代码操作 2.2、session2.2.1、session的运行流…

电容笔什么牌子好?比较好用的ipad手写笔推荐

哪一种电容笔适合学生党&#xff1f;作为一名数字爱好者&#xff0c;我对电容笔还是有所了解的。其实苹果的电容笔&#xff0c;与一般的电容笔最大的不同之处&#xff0c;就是在于压感方面上。因为苹果的电容笔具有独一无二的“重力压感”&#xff0c;所以我们可以在绘图时使用…

Allegro单独更改覆铜焊盘的连接方式

用Allegro进行PCB设计过程中,对于通孔焊盘,为了后续好维修,考虑到散热因素,默认使用的都是花焊盘的连接方式。 但是个别为了过大电流的通孔焊盘,为了增加载流,需要单独设置为全连接的方式。具体设置的方法如下: (1)点击菜单Shape 选择Select Shape or Void/Cavity(选…

力扣(LeetCode)2731. 移动机器人(C++)

脑经急转弯排序 碰撞只改变运动方向&#xff0c;速度始终如"1"&#xff0c;且机器人视为无差别的&#xff0c;所以碰撞等于擦肩而过&#xff01;"机器人碰撞&#xff0c;到底撞没撞&#xff0c;如撞。"因此只考虑每个机器人单方向移动&#xff0c;d秒后停…

asp.net网上销售系统VS开发mysql数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net 网上销售系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为mysql&#xff0c;使用c#语言开发 aspnet 网上销售系统1 二、功能介绍 前台功能…

【【萌新的SOC学习之GPIO学习 水】】

萌新的SOC学习之GPIO学习 General Purpose I/O 通用I/O zynq-7000 SOC PS 分为四大部分 APU application Processor UintMemoryIO外设Interconnect 内部互联 PL &#xff1a; IO外设 GPIO可以连接通用的设备&#xff08;比如按键&#xff09; 也可以用GPIO模拟其他的协议 GP…

电容笔有必要买吗?电容笔牌子排行

随着越来越多用户都开始用上了电容笔&#xff0c;苹果的Pencil&#xff0c;尽管功能强大&#xff0c;但是价格昂贵&#xff0c;并非所有人都可以有预算买得起。现在市面上有许多平替电容笔&#xff0c;其成本低、操作简便&#xff0c;因而受到了广泛的关注。所以&#xff0c;我…

Typora for Mac:优雅的Markdown文本编辑器,提升你的写作体验

Typora是一款强大的Markdown文本编辑器&#xff0c;专为Mac用户设计。无论你是写作爱好者&#xff0c;还是专业作家或博客作者&#xff0c;Typora都能为你提供无与伦比的写作体验。 1. 直观的界面设计 Typora的界面简洁明了&#xff0c;让你专注于写作&#xff0c;而不是被复…

绘制X-Bar-S图和X-Bar-R图,监测过程的稳定性和一致性

X-Bar-S图和X-Bar-R图是统计质量控制中常用的两种控制图&#xff0c;用于监测过程的稳定性和一致性。它们的主要区别在于如何计算和呈现数据的变化以及所关注的问题类型。 X-Bar-S图&#xff08;平均值与标准偏差图&#xff09;&#xff1a; X-Bar代表样本均值&#xff0c;S代表…

人机环系统智能中,事实和价值并不是独立的

一般情形下&#xff0c;人们尤其是西方常常把事实与价值区分开来&#xff0c;因此出现了研究事实的科学技术。事实是指客观存在、可以被验证或证明的情况或事件。它们与现实世界中的真实情况相对应&#xff0c;可以通过观察、实验或逻辑推理等方式来确定。而价值是指对事物的评…