vue3中的watch和watchEffect实例详解

Vue3中的watch和watchEffect实例详解

在Vue3中,watchwatchEffect可以定义响应式数据的副作用。本文会详细讲解两者的区别和使用方式,并给出几个实例示例说明。

watch

watch的基本用法是:当数据发生变化时执行一个函数。可以用来监听单个数据的变化,也可以监听多个数据。

监听单个数据

监听单个数据可以通过$watch函数或者watch选项实现。

$watch函数

$watch函数使用非常灵活,可以监听响应式数据的任何变化。以下是通过$watch监听一个数据变化的例子:

const { ref } = Vue
const count = ref(0)

const unwatch = appContext.app.$watch(count, (newValue, oldValue) => {
  console.log(`count从${oldValue}变成了${newValue}`)
})

setTimeout(() => {
  count.value++
}, 1000)

// 1秒后,输出:count从0变成了1

这里定义了一个count的响应式数据,然后通过$watch监听这个数据的变化。当count发生变化时,会执行传入的函数。

watch选项

如果需要在组件内监听数据变化时,可以使用watch选项。

const { ref, defineComponent } = Vue

export default defineComponent({
  setup() {
    const count = ref(0)

    watch(count, (newValue, oldValue) => {
      console.log(`count从${oldValue}变成了${newValue}`)
    })

    setTimeout(() => {
      count.value++
    }, 1000)

    return {
      count
    }
  }
})

这里通过监听count的变化打印出了新旧值。

监听多个数据

可以通过监听对象的方式监听多个数据,也可以使用深度监听。

监听对象

监听对象时,可以直接把对象传给$watchwatch选项。这里有一个示例:

const { ref } = Vue

const user = ref({ name: 'Jhon', age: 18 })

appContext.app.$watch(user, (newValue, oldValue) => {
  console.log(`user从${JSON.stringify(oldValue)}变成了${JSON.stringify(newValue)}`)
}, { deep: true })

setTimeout(() => {
  user.value.age++
}, 1000)

// 1秒后,输出:user从{"name":"Jhon","age":18}变成了{"name":"Jhon","age":19}

以上代码中,我们监听了一个对象user的变化。当user中的任意一个属性发生变化时,都会触发函数执行。

深度监听

通过deep选项可以实现深度监听,也就是在对象中有内部属性改变的情况下能够进行监听。

const { ref, watch } = Vue

const user = ref({ name: 'Jhon', age: { num: 18 } })

watch(user, (newValue, oldValue) => {
  console.log(`user从${JSON.stringify(oldValue)}变成了${JSON.stringify(newValue)}`)
}, { deep: true })

setTimeout(() => {
  user.value.age.num++
}, 1000)

// 1秒后,输出:user从{"name":"Jhon","age":{"num":18}}变成了{"name":"Jhon","age":{"num":19}}

watchEffect

watchEffect会自动追踪响应式数据的依赖,当其依赖(包括直接依赖和间接依赖)发生变化时,就会重新计算并执行提供的函数。本质上,watchEffect是一个将响应式数据和函数包装在一起的函数。因此,根据watchEffect理念,我们可以很轻松地实现一个计算属性。

const { ref, watchEffect } = Vue

const name = ref('Jhon')
const age = ref(18)

const fullName = watchEffect(() => {
  return `${name.value},${age.value}岁`
})

console.log(fullName) // 'Jhon,18岁'

setTimeout(() => {
  age.value++
}, 1000)

// 1秒后,输出:'Jhon,19岁'

以上代码中,我们定义了两个响应式数据nameage,然后通过watchEffect包装一个函数,返回一个计算属性。当age发生改变时,计算属性会重新计算并输出结果。

小结

  • watchwatchEffect可以对响应式数据进行监听,用来实现响应式数据的副作用。
  • watch用来监听单个或多个数据的变化,相对灵活,而watchEffect是一个将响应式数据和函数包装在一起的函数,自动追踪响应式数据的依赖,很适合实现计算属性。
  • watch()watchEffect()函数钩子的第二参数的确切使用方法是可以通过一个函数来监听多个值的改变。记得添加{deep: true}来启用监听深层次对象里的变化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue3中的watch和watchEffect实例详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vue 代码高亮插件全面对比测评

    下面是“vue 代码高亮插件全面对比测评”的完整攻略: 需求与介绍 本次测评旨在比较十字架(@kazupon/vue-i18n、vue-i18n、i18next)三种Vue国际化插件的优缺点。 插件介绍 @kazupon/vue-i18n @kazupon/vue-i18n 是一个基于 Vue.js 的双向绑定的国际化插件,是 vue-i18n 的作者 ka…

    Vue 2023年5月27日
    00
  • vue.js删除列表中的一行

    关于“vue.js删除列表中的一行”的完整攻略,可以分为以下几个步骤: 1. 在Vue中渲染列表 首先,在Vue中渲染出需要删除行的列表。在这个例子中,我们将使用v-for指令循环渲染一个列表,并为每个列表项添加一个删除按钮。 <template> <div> <ul> <li v-for="(item, …

    Vue 2023年5月29日
    00
  • 2020前端暑期实习大厂面经

    2020前端暑期实习大厂面经攻略 准备阶段 在进入实习面试准备的过程中,个人建议先掌握以下技能: HTML、CSS和JavaScript等基础技能。 掌握前端框架,例如Vue.js或者React.js等。 了解至少一种后端技术,例如Node.js、Java、Python等。 多练习算法和数据结构的题目。在一些公司面试的过程中,也会有算法题目,所以熟悉相关知识…

    Vue 2023年5月28日
    00
  • Vue3响应式对象是如何实现的(1)

    当我们使用Vue3来开发应用程序时,我们可能会频繁地使用响应式对象。那么,Vue3响应式对象是如何实现的呢? 在Vue3中,响应式对象是通过使用Proxy对象来实现的。Proxy是ES6的一个新特性,可以用来拦截JavaScript对象的操作。通过使用Proxy对象,我们可以实现Vue3的响应式对象功能。 下面,让我们通过两个示例来详细讲解Vue3响应式对象…

    Vue 2023年5月27日
    00
  • 浅谈Vue的组件间传值(包括Vuex)

    下面就为您详细讲解“浅谈Vue的组件间传值(包括Vuex)”的完整攻略: 一、组件间传值 在Vue中,父组件可以通过属性(prop)的方式向子组件传递数据,而子组件则可以通过事件($emit)的方式向父组件发送数据,从而实现组件间的数据传递。 1.1 父组件向子组件传值 在父组件中,通过在子组件标签上添加属性来向子组件传递数据,例如: <templat…

    Vue 2023年5月28日
    00
  • 解决vue.js提交数组时出现数组下标的问题

    当使用Vue.js提交表单数据数组时,会出现一个常见的问题,即无法获取到数组的下标,导致后台无法正确处理提交的数据。解决这个问题的方法很简单,本文将提供一些完整的攻略,帮助您解决这个问题。 问题分析 接下来的代码创建了一个表单,其中包含了一个可变长度的input数组。我们尝试提交这个表单,并触发表单提交事件: <form @submit.prevent…

    Vue 2023年5月29日
    00
  • VUE实现时间轴播放组件

    下面我来为您讲解VUE实现时间轴播放组件的完整攻略。 步骤一:初始化项目并安装依赖 首先,我们需要在本地初始化一个Vue项目并安装依赖: vue create my-timeline-app cd my-timeline-app npm install vue2-vis vis-data vis-timeline –save 我们使用了一个名为vis的第三…

    Vue 2023年5月29日
    00
  • Vue组件间的通信pubsub-js实现步骤解析

    下面我将详细讲解“Vue组件间的通信pubsub-js实现步骤解析”。 什么是pubsub-js? pubsub-js是一个基于发布/订阅模式的Javascript库,提供了一种解耦的方式,让我们的代码更加灵活和易于维护。在Vue组件间的通信中,我们可以使用pubsub-js来实现跨组件的数据传递。 pubsub-js的安装 我们可以使用npm或yarn在项…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部