Vue3watch 和 watchEffect

这篇具有很好参考价值的文章主要介绍了Vue3watch 和 watchEffect。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

watch 和 watchEffect

计算属性是通过声明性的计算衍生值,然而有些情况,我们需要在状态变化时执行一些"副作用",例如更改DOM,或是根据异步操作的结果去修改另一处的状态。

一般来说,computed主要是涉及计算某些值的时候使用,

watch(Effect)函数主要是监听某个状态,当某个状态改变时才会触发回调函数

watch参数(监听源,回调函数,{immediate: '" ", deep: " "}

第一个参数可以是不同形式的“数据源”:
	它可以是一个 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}`)
})

const obj = reactive({ count: 0 })

// 错误,因为 watch() 得到的参数是一个 number
watch(obj.count, (count) => {
  console.log(`count is: ${count}`)
})
上述问题的解决方案:用一个返回该属性的 getter 函数:
// 提供一个 getter 函数
watch(
  () => obj.count,
  (count) => {
    console.log(`count is: ${count}`)
  }
)

watchEffect

立即执行传入的回调函数,同时响应式的追踪依赖,依赖改变就会重新运行函数

watchEffect(async () => {
  const response = await fetch(
    `https://jsonplaceholder.typicode.com/todos/${todoId.value}`
  )
  data.value = await response.json()
})

这个例子不用想watch一样手动指定immediate:true,他会在组件首次渲染的时候就会执行一次,并且自动追踪todoId.value作为依赖,当todoId.value发生改变时,回调就会再次执行。相对于watch,不用指定immediate配置项,且不用明确指定数据源todoId.value

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

Tips: watchEffect仅仅会在同步执行期间追踪依赖,当使用异步回调的时候,只有在第一个await正常工作前访问的属性才会被跟踪

watch vs. watchEffect

watchwatchEffect 都能响应式地执行有副作用的回调。它们之间的主要区别是追踪响应式依赖的方式:

  • watch 只追踪明确侦听的数据源。它不会追踪任何在回调中访问到的东西。另外,仅在数据源确实改变时才会触发回调。watch 会避免在发生副作用时追踪依赖,因此,我们能更加精确地控制回调函数的触发时机。
  • watchEffect,则会在副作用发生期间追踪依赖。它会在同步执行过程中,自动追踪所有能访问到的响应式属性。这更方便,而且代码往往更简洁,但有时其响应性依赖关系会不那么明确

函数触发时机

watchEffect 是一个副作用函数, 在 DOM 挂载或更新之前就会触发。

<template>
  <div>
    动物:
    <input id="ipt" v-model="fish.name" />
  </div>
</template>
<script lang="ts" setup>
import { reactive, watchEffect } from 'vue'
interface Animal {
  name: string
  type: string
}
let fish = reactive<Animal>({
  name: '酸菜鱼',
  type: '又酸又菜又多余',
})
watchEffect<Animal>(() => {
  console.log('fish', fish.name)
  const ipt: HTMLElement = document.querySelector('#ipt') as HTMLElement
  console.log('ipt', ipt)
})
</script>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iMUTAjBX-1680081569864)(C:\Users\26387\AppData\Roaming\Typora\typora-user-images\image-20230329164828475.png)]

第一次获取到的元素是 null,执行第二次监听的时候才会获取到元素。

清除watchEffect的副作用的方法

通过flush:post 可以避免副作用,在 DOM 更新后运行副作用,确保模板引用与 DOM 保持同步,并引入正确元素。

或者使用watchPostEffect(),该函数和watctEffect()一样,不同之处在于会直接在Vue 更新后执行

import { watchPostEffect } from 'vue'
watchPostEffect(() => {
  /* 在 Vue 更新后执行 */
})

vue3watch和watcheffech,Vue3,javascript,前端,vue.js

image-20230329165059064

​ onTrack 和 onTrigger 用于调试一个侦听器的行为。

​ 清除副作用函数(onInvalidate)。

​ watchEffect 的第一个参数回调函数,也有自己的参数 – onInvalidate。它也是一个函数,用于清除 effect 产生的副作用

watchEffect<Type>(
  (oninvalidate) => {
    console.log('监听参数',)
    oninvalidate(() => {
      console.log('before')
    })
  }
  
  ....其他逻辑代码
)

​ oninvalidate 只作用于异步函数,只有两种情况才会被调用:

  • watchEffect 第一个参数是 effect 回调函数,当 effect 被重新调用时。
  • 当监听器被注销时。

watch的触发时间是:监听某个特定属性变化时,并能够返回改变前后的值

停止侦听器

一个关键点是,侦听器必须用同步语句创建:如果用异步回调创建一个侦听器,那么它不会绑定到当前组件上,你必须手动停止它,以防内存泄漏。如下方这个例子:

const unwatch = watchEffect(() => {})

// ...当该侦听器不再需要时
unwatch()

注意,需要异步创建侦听器的情况很少,请尽可能选择同步创建。如果需要等待一些异步数据,你可以使用条件式的侦听逻辑:文章来源地址https://www.toymoban.com/news/detail-829050.html

// 需要异步请求得到的数据
const data = ref(null)

watchEffect(() => {
  if (data.value) {
    // 数据加载后执行某些操作...
  }
})

到了这里,关于Vue3watch 和 watchEffect的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3 computed 和 watch 的差异

    🙂博主:锅盖哒 🙂文章核心: vue3 computed 和 watch 的差异 目录 前言 用法 computed watch 代码 理解 高质量的使用 Vue.js作为一种现代化的前端框架,提供了丰富的特性来帮助开发者构建高效和响应式的用户界面。在这其中, computed 和 watch 是两个非常重要的选项,它们都用于处理

    2024年02月08日
    浏览(49)
  • Vue3学习——computed、watch、watchEffect

    与Vue2.x中computed配置功能一致 写法 注意 监视reactive定义的响应式数据时:oldValue无法正确获取、强制开启了深度监视(deep配置失效)。 监视reactive定义的响应式数据中的某个属性时:deep配置有效。 情况一:监视ref定义的响应式数据 监视ref定义的对象,改变某一个属性时,

    2024年02月22日
    浏览(64)
  • Vue3 —— watch 监听器及源码学习

    该文章是在学习 小满vue3 课程的随堂记录 示例均采用 script setup ,且包含 typescript 的基础用法 在 vue3 中,必须是 ref 、 reactive 包裹起来的数据,才可以被 watch 监听到 1、语法: watch(source, cb, options) source 是监听的目标,有 4 种书写形式: reactive 形式的响应式数据 ref 形式的响

    2024年02月12日
    浏览(39)
  • Vue3中watch与watchEffect的区别

    给大家打一个比喻 watch:教导主任叫老师看张三和李四是否在睡觉 watchEffect:教导主任叫老师看班上有谁在睡觉,在睡觉的就报告 1.都能监听响应式数据的变化,不同的是监听数据变化的方式不同 2.watch:要明确指出监视的数据 3.watchEffect:不用明确的指出监视的数据(函数中

    2024年02月21日
    浏览(43)
  • vue3的watchEffect和watch其他参数

    目录 1、watchEffect基本使用 2、watch 与 watchEffect的异同 3、watch其他参数使用 1、watchEffect基本使用 1 回调函数立即调用 2 回调函数依赖的数据都会被监控 3 深度监控 2 、 watch 与 watchEffect的异同 1、 相同点 :都可以对数据进行侦听 2、 不同点 :watchEffect回调函数立即调用、对回调

    2024年01月24日
    浏览(40)
  • 【源码系列#04】Vue3侦听器原理(Watch)

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核💪推荐🙌 欢迎各位ITer关注点赞收藏🌸🌸🌸 侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数 第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性

    2024年02月04日
    浏览(68)
  • vue全家桶进阶之路32:Vue3 WatchEffect和watch 监听

    在 Vue 3 中, watchEffect 是一个用于监听响应式数据变化的 API。它可以在函数内部自动跟踪数据的依赖,并在依赖变化时重新运行函数。 watchEffect  的作用以及各个参数的功能讲解: watchEffect(effect: (onInvalidate: InvalidateCbRegistrator) = void | (() = void) | Promisevoid, options?: WatchEffectOptio

    2023年04月17日
    浏览(78)
  • vue3 watch 监听多值以及深度监听用法

    1.监听单个值 引入: import {…, watch} from “vue”; import {useRouter} from ‘vue-router’; 2.监听多个值 还是上面路由的例子 2.深度监听

    2024年02月14日
    浏览(55)
  • vue3中用watch监听响应式数据的注意点

    如果你在vue3中使用reactive()方法创建响应式数据,然后又用torefs()方法将响应式数据解构成单一的ref响应式数据。 此时,如果你想用watch监听解构出来单一的响应式数据,watch不起作用。 此时,你需要用watch监听之前的reactive()方法创建的数据,这样是能监听到的,要开启深度监

    2024年02月13日
    浏览(40)
  • vue3:7、组合式API-watch

     

    2024年02月09日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包