广告
返回顶部
首页 > 资讯 > 精选 >Vue3中怎么使用watch监听对象的属性值
  • 188
分享到

Vue3中怎么使用watch监听对象的属性值

2023-07-04 20:07:53 188人浏览 安东尼
摘要

这篇文章主要介绍“vue3中怎么使用watch监听对象的属性值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue3中怎么使用watch监听对象的属性值”文章能帮助大家解决问题。Vue3 中使用 w

这篇文章主要介绍“vue3中怎么使用watch监听对象的属性值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue3中怎么使用watch监听对象的属性值”文章能帮助大家解决问题。

Vue3 中使用 watch 侦听对象中的具体属性

1.前言

<script lang="ts" setup>// 接受父组件传递的数据    const props = defineProps({        test: {            type: String,            default: ''        }    })        // 使用 watch 侦听 props 中的 test 属性    watch(        // 这种写法不会侦听到 props 中 test 的变化    props.test,        () => {            console.log("侦听成功")        }    )        watch(    // 这种写法会侦听到 props 中 test 的变化        () => props.test,        () => {            console.log("侦听成功")        }    )</script>

watch 的基本用法

watch() 默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数

第一个参数:侦听源,侦听源可以是一下几种

一个函数,返回一个值一个 ref一个响应式对象(Reactive)或是由以上类型的值组成的数组

第二个参数:侦听源发生变化时要触发的回调函数。

(newValue, oldValue) => { }

当侦听多个来源时,回调函数接受两个数组,分别对应源数组中的新值和旧值

( [ newValue1, newValue2 ] , [ oldValue1 , oldValue2 ]) => {}

第三个参数:可选对象,可以支持一下这些选项

immediate:侦听器创建时立即触发回调deep:如果源是一个对象,会强制深度遍历,以便在深层级发生变化时触发回调函数flush:调整回调函数的刷新时机onTrack / onTrigger:调试侦听器的依赖

2. 原因

因为watch的侦听源只能是上面的4中情况

const obj = reactive({ count: 0 })// 错误,因为 watch() 中的侦听源是一个 number,最终 source 返回的 getter 函数是一个空,所以就得不到侦听的数据watch(obj.count, (count) => {  console.log(`count is: ${count}`)})// 正确,主要思想是,将侦听源转化为以上4种类型(转化为getter函数是最简单方便的)watch(  () => obj.count,  (count) => {    console.log(`count is: ${count}`)  })

3.watch源码分析

export function watch<T = any, Immediate extends Readonly<boolean> = false>(  source: T | WatchSource<T>,  cb: any,  options?: WatchOptions<Immediate>): WatchStopHandle {  if (__DEV__ && !isFunction(cb)) {    warn(      `\`watch(fn, options?)\` signature has been moved to a separate api. ` +      `Use \`watchEffect(fn, options?)\` instead. \`watch\` now only ` +      `supports \`watch(source, cb, options?) signature.`    )  }  return doWatch(source as any, cb, options)}

源码中可以看出,watch接收三个参数:source侦听源、cb回调函数、options侦听配置,最后会返回一个doWatch

4.doWatch源码分析

function doWatch(  source: WatchSource | WatchSource[] | WatchEffect | object,  cb: WatchCallback | null,  { immediate, deep, flush, onTrack, onTrigger }: WatchOptions = EMPTY_OBJ): WatchStopHandle {  // ...// 当前组件实例const instance = currentInstance// 副作用函数,在初始化effect时使用let getter: () => any// 强制触发侦听let forceTrigger = false// 是否为多数据源。let isMultiSource = false}

doWatch依然接受三个参数:source侦听源、cb回调函数、options侦听配置

这里着重对侦听源的源码进行分析(source标准化

  • 如果sourceref类型,getter是个返回source.value的函数,forceTrigger取决于source是否是浅层响应式。

if (isRef(source)) {  getter = () => source.value  forceTrigger = isshallow(source)}
  • 如果sourcereactive类型,getter是个返回source的函数,并将deep设置为true。 当直接侦听一个响应式对象时,侦听器会自动启用深层模式

if (isReactive(source)) {  getter = () => source  deep = true}

例子

<template>  <div class="container">    <h3>obj---{{ obj }}</h3>    <button @click="changeName">修改名字</button>    <button @click="changeAge">修改年龄</button>  </div></template><script lang="ts" setup>import { reactive, watch } from "vue";const obj = reactive({  name: "张三",  age: 18,});const changeName = () => {  obj.name += "++";};const changeAge = () => {  obj.age += 1;};// obj 中的任一属性变化了,都会被监听到watch(obj, () => {  console.log("变化了");});</script>
  • 如果source是个数组,将isMultiSource设为trueforceTrigger取决于source是否有reactive类型的数据,getter函数中会遍历source,针对不同类型的source做不同处理。

if (isArray(source)) {  isMultiSource = true  forceTrigger = source.some(isReactive)  getter = () =>    source.map(s => {      if (isRef(s)) {        return s.value      } else if (isReactive(s)) {        return traverse(s)      } else if (isFunction(s)) {        return callWithErrorHandling(s, instance, ErrorCodes.WATCH_GETTER)      } else {        __DEV__ && warnInvalidSource(s)      }    })}
  • 如果source是个function。存在cb的情况下,getter函数中会执行source,这里source会通过callWithErrorHandling函数执行,在callWithErrorHandling中会处理source执行过程中出现的错误;不存在cb的话,在getter中,如果组件已经被卸载了,直接return,否则判断cleanupcleanup是在watchEffect中通过onCleanup注册的清理函数),如果存在cleanup执行cleanup,接着执行source,并返回执行结果。source会被callWithAsyncErrorHandling包装,该函数作用会处理source执行过程中出现的错误,与callWithErrorHandling不同的是,callWithAsyncErrorHandling会处理异步错误。

if (isFunction(source)) {  if (cb) {    getter = () =>      callWithErrorHandling(source, instance, ErrorCodes.WATCH_GETTER)  } else {    // watchEffect    getter = () => {      // 如果组件实例已经卸载,直接return      if (instance && instance.isUnmounted) {        return      }      // 如果清理函数,则执行清理函数      if (cleanup) {        cleanup()      }      // 执行source,传入onCleanup,用来注册清理函数      return callWithAsyncErrorHandling(        source,        instance,        ErrorCodes.WATCH_CALLBACK,        [onCleanup]      )    }  }}
  • 其他情况getter会被赋值为一个空函数

getter = NOOP__DEV__ && warnInvalidSource(source)

关于“Vue3中怎么使用watch监听对象的属性值”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Vue3中怎么使用watch监听对象的属性值

本文链接: https://www.lsjlt.com/news/347286.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue3中怎么使用watch监听对象的属性值
    这篇文章主要介绍“Vue3中怎么使用watch监听对象的属性值”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue3中怎么使用watch监听对象的属性值”文章能帮助大家解决问题。Vue3 中使用 w...
    99+
    2023-07-04
  • Vue3中watch监听对象的属性值(监听源必须是一个getter函数)
    目录Vue3 中使用 watch 侦听对象中的具体属性1.前言2. 原因3.watch源码分析4.doWatch源码分析5.总结Vue3 中使用 watch 侦听对象中的具体属性 1...
    99+
    2022-12-20
    Vue3 watch监听对象 Vue3 watch监听 Vue3  getter函数
  • vue怎么使用watch监听属性
    这篇文章主要介绍了vue怎么使用watch监听属性的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue怎么使用watch监听属性文章都会有所收获,下面我们一起来看看吧。基本用法Vue watch最重要的使用场景...
    99+
    2023-06-30
  • Angular中如何使用$watch监听object属性值
    这篇文章主要介绍Angular中如何使用$watch监听object属性值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Angular中的$watch可以监听属性值的变化,然后并做出...
    99+
    2022-10-19
  • 使用watch监听对象里面值的变化
    目录watch监听对象里面值的变化1.样式代码2.data里的代码3.watch监听watch如何深度监听对象变化深度监听总结watch监听对象里面值的变化 后台管理有时候有选择选择...
    99+
    2023-01-14
    watch监听对象 watch监听 watch监听对象值变化
  • vue中watch监听对象中某个属性的方法
    目录immediate 和 handlerdeep 深度监听以currentParams为例,监听selOrgId属性immediate 和 handler watch 的用法有个特...
    99+
    2023-05-17
    vue watch监听对象属性 vue watch监听
  • Vue怎么使用watch监听数组或对象
    这篇文章主要介绍“Vue怎么使用watch监听数组或对象”,在日常操作中,相信很多人在Vue怎么使用watch监听数组或对象问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么使用watch监听数组或对象...
    99+
    2023-07-02
  • Vue Watch方法不能监听到数组或对象值的改变怎么解决
    这篇文章主要介绍了Vue Watch方法不能监听到数组或对象值的改变怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue Watch方法不能监听到数组或对象值的改变怎么解决文章都会有...
    99+
    2023-06-29
  • Vue中的计算属性与监听属性怎么用
    今天小编给大家分享一下Vue中的计算属性与监听属性怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、为什么要使用计算属...
    99+
    2023-06-29
  • Vue3中的计算属性及侦听器怎么使用
    计算属性我们知道,在模板中可以直接通过插值语法显示一些data中的数据,但是在某些情况,我们可能需要对数据进行一些转化后再显示,或者需要将多个数据结合起来进行显示在模板中使用表达式,可以非常方便的实现,但是设计它们的初衷是用于简单的运算,在...
    99+
    2023-05-14
    Vue3
  • 怎么使用java反射获取对象属性值
    使用Java反射获取对象属性值的步骤如下:1. 获取对象的Class对象,可以通过对象的getClass()方法获取。```java...
    99+
    2023-09-26
    java
  • java怎么使用反射给对象属性赋值
    本文小编为大家详细介绍“java怎么使用反射给对象属性赋值”,内容详细,步骤清晰,细节处理妥当,希望这篇“java怎么使用反射给对象属性赋值”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言最近项目中遇到一个问题...
    99+
    2023-07-05
  • vue中watch检测不到对象属性的变化怎么办
    小编给大家分享一下vue中watch检测不到对象属性的变化怎么办,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!正文<template>  <div> &n...
    99+
    2022-10-19
  • Vue中的watch侦听器、计算属性、Vue-cli和组件怎么使用
    这篇文章主要介绍了Vue中的watch侦听器、计算属性、Vue-cli和组件怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Vue中的watch侦听器、计算属性、Vue-cli和组件怎么使用文章都会有所收...
    99+
    2023-06-30
  • ES6中怎么用解构赋值获取嵌套对象的属性
    小编给大家分享一下ES6中怎么用解构赋值获取嵌套对象的属性,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!用解构赋值获取嵌套对象的...
    99+
    2022-10-19
  • ASP.NET中HttpContext对象下的属性怎么用
    这篇文章主要讲解了“ASP.NET中HttpContext对象下的属性怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET中HttpContext对象下的属性怎么用”吧!一、H...
    99+
    2023-06-30
  • VB.NET中Process的属性与对象怎么用
    这篇文章主要介绍VB.NET中Process的属性与对象怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!你再也不需要使用Win32应用编程接口或者VB的Shell函数来启动外部应用程序了。因为你可以使用.NET框...
    99+
    2023-06-17
  • es6对象增加新的属性怎么使用
    今天小编给大家分享一下es6对象增加新的属性怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。es6对象增加新的属性是“...
    99+
    2023-07-04
  • jdk8中怎么使用stream实现对象属性的合并
    这篇“jdk8中怎么使用stream实现对象属性的合并”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“jdk8中怎么使用str...
    99+
    2023-06-26
  • 怎么用Java比较两个对象中全部属性值是否相等
    本篇内容介绍了“怎么用Java比较两个对象中全部属性值是否相等”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!例如下述Java类:import...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作