Vue3的watchEffect的妙用,与watch的区别

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

前言

在Vue3中,引入了Composition API,其中的watchEffect()函数是一个非常强大和灵活的工具,用于处理响应式数据的变化,使得项目更加弹性和灵活。它与watch有所不同,本文将介绍watchEffect()的定义、特点、与watch的区别以及使用时的注意事项。

一、定义

watchEffect()函数用于创建一个自动追踪依赖的响应式副作用。它会在初始化时会立即执行一次,并自动追踪在回调函数中使用的所有响应式数据,在这些数据发生变化时重新运行回调函数。

例如,在每当 todoId 的引用发生变化时使用侦听器来加载一个远程资源,如果用watch,是这么写:

<template>
  <div>Test</div>
</template>

<script setup>
  import { ref, watch } from 'vue'
  const todoId = ref(1)
  const data = ref(null)

  watch(
    todoId,
    async () => {
      const response = await fetch(`https://jsonplaceholder.typicode.com/todos/${todoId.value}`)
      data.value = await response.json()
      console.log(data.value)
    },
    { immediate: true }
  )
</script>

打印:

Vue3的watchEffect的妙用,与watch的区别,vue,vue.js,前端,javascript

但是用了watchEffect()就可以简化为:

<template>
  <div>Test</div>
</template>

<script setup>
  import { ref, watchEffect } from 'vue'
  const todoId = ref(1)
  const data = ref(null)

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

 打印:

Vue3的watchEffect的妙用,与watch的区别,vue,vue.js,前端,javascript

两者都立即打印了data。但下面的例子中,回调会立即执行,不需要指定 immediate: true。在执行期间,它会自动追踪 todoId.value 作为依赖(和计算属性类似)。每当 todoId.value 变化时,回调会再次执行。有了 watchEffect(),我们不再需要明确传递 todoId 作为源值。

从这个角度来看,watchEffect()的作用类似于Vue2中的computed,即依赖项发生变化,自己也跟着改变。但与computed不同,watchEffect()没有返回值,而是直接执行回调函数。

二、特点

watchEffect()自动追踪其回调函数中使用的所有响应式数据,并在这些数据发生变化时重新运行回调函数。这使得我们无需手动指定要监听的具体属性,减少了代码的冗余。

    对于这种只有一个依赖项的例子来说,watchEffect() 的好处相对较小。但是对于有多个依赖项的侦听器来说,使用 watchEffect() 可以消除手动维护依赖列表的负担。

    此外,如果你需要侦听一个嵌套数据结构中的几个属性,watchEffect() 可能会比深度侦听器更有效,因为它将只跟踪回调中被使用到的属性,而不是递归地跟踪所有的属性。 

多个依赖项例子:

<template>
  <div>Test</div>
</template>

<script setup>
  import { reactive } from 'vue'
  const state = reactive({
    count: 0,
    name: 'John',
    age: 25
  })

  // 使用watchEffect()监听count和name的变化
  watchEffect(() => {
    console.log('count or name changed:', state.count, state.name)
  })

  // 模拟count和name变化
  setTimeout(() => {
    state.count = 1 // 输出'count or name changed: 1 John'
    state.name = 'Alice' // 输出'count or name changed: 1 Alice'
  }, 1000)
</script>

打印:

Vue3的watchEffect的妙用,与watch的区别,vue,vue.js,前端,javascript

深度依赖例子:

<template>
  <div>Test</div>
</template>

<script setup>
  import { reactive, watchEffect } from 'vue'
  const state = reactive({
    person: {
      name: 'John',
      age: 25
    },
    todos: [
      { text: 'Task 1', completed: false },
      { text: 'Task 2', completed: true },
      { text: 'Task 3', completed: false }
    ]
  })

  // 使用watchEffect()监听person对象中name和age的变化
  watchEffect(() => {
    console.log('person changed:', state.person.name, state.person.age)
  })

  // 模拟person中name和age的变化
  setTimeout(() => {
    state.person.name = 'Alice' // 输出'person changed: Alice 25'
    state.person.age = 30 // 输出'person changed: Alice 30'
  }, 1000)
</script>

打印:

Vue3的watchEffect的妙用,与watch的区别,vue,vue.js,前端,javascript

三、与watch的区别

1. 监听方式不同watchEffect()是自动追踪所有使用的响应式数据,而watch需要手动指定要监听的特定属性。

2. 监听粒度不同watchEffect()监听的是响应式数据的整个变化,而watch可以侦听指定的属性或表达式的变化。

3. 计算属性处理方式不同:对于计算属性,watchEffect()会自动依赖于计算属性使用到的响应式数据,而watch需要手动指定计算属性为监听目标。

四、注意事项

1. 避免过度监听:由于watchEffect()会追踪使用到的所有响应式数据,因此要确保在回调函数中只使用必要的响应式数据,避免造成不必要的渲染开销。

2. 异步操作需谨慎处理:由于watchEffect()会立即执行回调函数,如果在回调函数中进行异步操作,需要谨慎处理,以免导致意外行为或副作用。

<script setup>
import { watchEffect } from 'vue'

// 它会自动停止
watchEffect(() => {})

// ...这个则不会!
setTimeout(() => {
  watchEffect(() => {})
}, 100)
</script>

3. 避免无限循环:当在watchEffect()的回调中修改响应式数据时,可能会导致无限循环。要避免此问题,可以使用watch()函数并设置immediate: true选项,或者使用ref来存储临时数据。文章来源地址https://www.toymoban.com/news/detail-593762.html

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

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

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

相关文章

  • Vue3学习——computed、watch、watchEffect

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

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

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

    2024年01月24日
    浏览(31)
  • Vue3watch 和 watchEffect

    计算属性是通过声明性的计算衍生值,然而有些情况,我们需要在状态变化时执行一些\\\"副作用\\\",例如更改DOM,或是根据异步操作的结果去修改另一处的状态。 一般来说,computed主要是涉及计算某些值的时候使用, watch(Effect)函数主要是监听某个状态,当某个状态改变时才会触

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

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

    2023年04月17日
    浏览(66)
  • Vue3.0 watch和watchEffect监听器:VCA

    在项目中,有时候检测一个变量的值是否反升了变化。通常使用的watch或者使用低效的循环判断。 在次vue中给我们设置了深度监测数据繁盛变化的方法。 1.vue中提供了在watch监听时设置deep:true 就可以实现对对象的深度监听; 2.immediate:true,代表watch里面声明了之后会立马执行han

    2024年02月06日
    浏览(34)
  • 【Vue学习笔记5】Vue3中的响应式:ref和reactive、watchEffect和watch

    所谓响应式就是界面和数据同步,能实现实时更新。 Vue 中用过三种响应式解决方案,分别是 defineProperty、Proxy 和 value setter。Vue 2 使用的方案是 defineProperty API。Vue3中使用的方案是Proxy和value setter。 vue3中实现响应式数据的方法是使用ref和reactive。 reactive更推荐去定义复杂的数

    2024年02月03日
    浏览(34)
  • Vue Composition API之侦听器watch/watchEffect

    在日常的开发中,很多时候我们需要去对一些状态进行监听,比如当显示学生的成绩列表时,我们使用一个学生的学号student_num作为请求成绩的参数,如果没有监听机制,当学号student_num改变时,我们需要依赖用户的操作去刷新成绩。但是有了侦听器,我们可以通过侦听器去监

    2024年02月08日
    浏览(28)
  • Vue3前端开发,watch数据侦听器的立即执行

    Vue3前端开发,watch数据侦听器的立即执行!实际上,我们可以通过回调函数的后面,再追加一个对象,来设置这个参数,immediate:true.来实现一种立即执行的效果。在页面记载完成后,马上就会执行一次watch. 如上所示,我们在回调函数的后面,追加了一个参数,是一个对象类型

    2024年01月18日
    浏览(36)
  • Vue3前端开发,watch侦听器的深度监听和精确监听

    Vue3前端开发,watch侦听器的深度监听和精确监听!今天和大家分享的内容是,关于watch的深度侦听和精确监听。 首先看一下,第一个案例,练习的是,深度监听的效果。默认是浅的侦听,是不会触发回调函数的。 如图,当我们点击按钮,修改num值的时候,触发了回调函数,在

    2024年01月23日
    浏览(28)
  • 【Vue3】vue3中的watchEffect使用及其他的API

    目录  一,watchEffect 二,生命周期 三,什么是hooks? 四,toRef  五,其他组合式API 5.1shallowReactiveshallowRef 5.2readonlyshallowReadonly 5.3.toRawmarkRaw 5.4自定义Ref-customRef ​5.5provide$inject 5.6响应式数据的判断 写在最后     1.watch: 既要指明监视的属性,也要指明监视的回调。 2.watchEffect: 不

    2024年02月01日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包