当前位置: 首页 > news >正文

vue3 watch的各种使用情景

watch监听ref单个简单数据

const switchStatus = ref(props.checked)
watch(
      switchStatus,
      (newVal,oldVal) => {
      	console.log(newVal,oldVal)
      },
      {
        immediate: true
      }
    )

watch监听ref多个简单数据

    watch(
      [switchStatus, switchClassName],
      (newVal, oldVal) => {
        console.log(newVal, oldVal)
      },
      {
        immediate: true
      }
    )

// newVal和oldVal也是数组
在这里插入图片描述
相信大家通过上面的代码也发现了,watch的第三个参数为可配置项,用来配置我们熟悉的immediate和deep

watch监听reactive数据的全部属性

const person = reactive({
      name: 'dx',
      age: 18
    })
watch(
      person,
      (newVal, oldVal) => {
        console.log(newVal, oldVal)
      },
      {
        immediate: true
      }
    )
const changePerson = () => {
      person.age = 19
    }
changePerson()

在这里插入图片描述
问题一 :除了第一次能查到oldVal和newVal,后面基本拿不到oldVal

const person = reactive({
      name: 'dx',
      age: 18,
      job: {
        place: '成都'
      }
    })
watch(
      person,
      (newVal, oldVal) => {
        console.log(newVal, oldVal)
      },
      {
        immediate: true
      }
    )
const changePerson = () => {
      person.job.place = '重庆'
    }
changePerson()

在这里插入图片描述
问题二 与vue2不同,我没加deep为true,但watch也能监听到,并且和加了deep为true没区别,有点像强制监听。

watch监听reactive定义的响应式数据中某个属性

    const person = reactive({
      name: 'dx',
      age: 18,
      job: {
        place: '成都'
      }
    })
     watch(
      () => person.job.place,
      (newVal, oldVal) => {
        console.log(newVal, oldVal)
      },
      {
        immediate: true
      }
    )
    const changePerson = () => {
      person.job.place = '重庆'
    }
    changePerson()

在这里插入图片描述
如果要监听某一个具体的属性,请在watch的第一个参数写成一个函数,并返回要监听的属性

watch监听reactive定义的响应式数据中某些属性

    const person = reactive({
      name: 'dx',
      age: 18,
      job: {
        place: '成都'
      }
    })
    watch(
      [() => person.job.place, () => person.age],
      (newVal, oldVal) => {
        console.log(newVal, oldVal)
      },
      {
        immediate: true
      }
    )
    const changePerson = () => {
      person.job.place = '重庆'
      person.age = 19
    }

    changePerson()

在这里插入图片描述
watch监听一个reactive的多个属性,将watch的第一个参数变为数组,每一个数组元素都是函数,并且返回要监听的属性

特殊情况

1.watch监听reactive中某个属性,依然是复杂数据类型

    const person = reactive({
      name: 'dx',
      age: 18,
      job: {
        a: {
          place: '成都'
        }
      }
    })

    watch(
      () => person.job,
      (newVal, oldVal) => {
        console.log(newVal, oldVal)
      },
      {
        immediate: true
      }
    )

    const changePerson = () => {
      person.job.a.place = '重庆'
    }

    changePerson()

在这里插入图片描述
发现除了immediate第一次触发了watch外,改变person.job.a.place = '重庆’并未触发watch
这种情况,需要加deep:true,用函数返回的复杂数据,没有强制开启deep。

    const person = reactive({
      name: 'dx',
      age: 18,
      job: {
        a: {
          place: '成都'
        }
      }
    })

    watch(
      () => person.job,
      (newVal, oldVal) => {
        console.log(newVal, oldVal)
      },
      {
        immediate: true,
        deep: true
      }
    )

    const changePerson = () => {
      person.job.a.place = '重庆'
    }

    changePerson()

在这里插入图片描述
加了deep后,watch被触发了,但拿不到oldVal的值。

  1. watch监听ref定义的复杂数据
    const person = ref({
      name: 'dx',
      age: 18,
      job: {
        a: {
          place: '成都'
        }
      }
    })

    watch(
      person.value,
      (newVal, oldVal) => {
        console.log(newVal, oldVal)
      },
      {
        immediate: true,
        deep: true
      }
    )

    const changePerson = () => {
      person.value.job.a.place = '重庆'
    }

    changePerson()

在这里插入图片描述
当然,因为是复杂数据,默认开启了deep,但也拿不到oldVal

相关文章:

  • Dubbo(二)
  • Qt6.3.2下QChart的使用
  • GAM注意力机制
  • ts流中的时间概念: pcr,pts,dts 实例解说
  • 申请ISO50430建筑体系认证有哪些注意问题?
  • MyEclipse技术深度剖析——企业级的Java EE Jakarta EE IDE
  • 一分钟学会Selenium
  • 【网络安全】逻辑漏洞保姆级讲解
  • 聚焦能源与双碳管理需求,格创东智为锂电企业降耗赋能
  • 2022年最新最详细的MYSQL数据库安装(详细图解过程、毕成功)
  • VUE路由案例(商品列表)---vue练习必选项目(附原码)
  • 过采样、欠采样
  • 【微服务】Ribbon负载均衡
  • Spring Boot 框架
  • JavaScript系列之async与await
  • Java面向对象及其三大特征
  • JS笔记四:作用域、变量(函数)提升
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • nodejs实现webservice问题总结
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Terraform入门 - 1. 安装Terraform
  • Vue实战(四)登录/注册页的实现
  • 包装类对象
  • 编写高质量JavaScript代码之并发
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 记一次用 NodeJs 实现模拟登录的思路
  • 全栈开发——Linux
  • 通过git安装npm私有模块
  • 微信公众号开发小记——5.python微信红包
  • 延迟脚本的方式
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 译米田引理
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #LLM入门|Prompt#3.3_存储_Memory
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (定时器/计数器)中断系统(详解与使用)
  • (强烈推荐)移动端音视频从零到上手(上)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)大型网站架构演变和知识体系
  • ***详解账号泄露:全球约1亿用户已泄露
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .gitignore文件—git忽略文件
  • .NET 指南:抽象化实现的基类
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .net项目IIS、VS 附加进程调试
  • ::前边啥也没有
  • @RunWith注解作用
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [20171102]视图v$session中process字段含义
  • [AIGC codze] Kafka 的 rebalance 机制
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试