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小白入门教程攻略 Vue.js是现在最火热的前端框架之一。它提供了一种简洁、高效的方式来构建现代化的Web应用程序。本教程将引导您轻松入门并开始使用Vue.js构建您的第一个Web应用程序。 步骤1: 安装Vue.js Vue.js可以通过CDN链接或者通过下载文件的形式来引入到页面中。我们推荐使用CDN链接的方式来引入Vue.js。 在你的HTML文…

    Vue 2023年5月28日
    00
  • webpack中如何加载静态文件的方法步骤

    当我们使用webpack进行前端工程化打包构建时,经常会涉及到加载静态文件的问题,包括但不限于图片、字体、音视频等多种类型的文件。接下来,我将为大家介绍 webpack 中如何加载静态文件的方法步骤。 1. 安装相关loader webpack 对于不同类型的静态文件,需要用对应的 loader 来进行加载。 以图片文件为例,可以安装 file-loader…

    Vue 2023年5月28日
    00
  • vue使用video插件vue-video-player的示例

    下面是使用Vue.js框架中的插件vue-video-player的示例攻略: 准备工作 在开始之前,你需要先安装Vue.js和vue-video-player插件。如果你还没有安装这两个工具,请参考以下命令进行安装: # 安装 Vue.js npm install vue # 安装 vue-video-player npm install vue-vide…

    Vue 2023年5月27日
    00
  • 改变vue请求过来的数据中的某一项值的方法(详解)

    下面我将详细讲解改变 Vue 组件请求过来的数据中的某一项值的方法。 确定需要修改的数据 首先我们需要确定需要修改的数据,可以通过在 Vue 组件的 mounted 或 created 钩子中打印请求到的数据,查看需要修改的数据具体位置。比如下面这个例子: export default { data() { return { user: null } }, …

    Vue 2023年5月29日
    00
  • vue中的inject学习教程

    关于“vue中的inject学习教程”的完整攻略,我们可以分为以下几个部分进行讲解: 一、inject的作用 inject 是在 Vue.js 上层组件向其下层子组件注入数据的方式。它支持我们在子组件中访问父组件的数据,不管层级有多深,而不需要一层层通过 prop 或事件来传递。因此,inject 及其衍生出的 provide 可以在一定程度上解决跨组件之间…

    Vue 2023年5月28日
    00
  • 基于vue2框架的机器人自动回复mini-project实例代码

    下面是针对“基于vue2框架的机器人自动回复mini-project实例代码”的详细攻略: 1. 环境搭建 首先,我们需要搭建好vue2的项目基础环境。可以通过如下命令创建一个vue2项目: vue create robot-reply-project 然后,进入项目目录cd robot-reply-project,安装一些需要的依赖: npm i axio…

    Vue 2023年5月28日
    00
  • 几个你不知道的技巧助你写出更优雅的vue.js代码

    下面是关于“几个你不知道的技巧助你写出更优雅的vue.js代码”的完整攻略,包括以下方面: 使用 Vue.js 官方插件 Vue.js 团队开发并维护了一系列的插件,这些插件可以帮助你更加方便地开发和调试 Vue.js 应用。其中,最常用的插件是 Vue.js Devtools,它提供了一些实用的功能,例如调试工具、性能分析、检查组件等。除此之外,还有 Vu…

    Vue 2023年5月29日
    00
  • 使用Webpack 搭建 Vue3 开发环境过程详解

    使用Webpack搭建Vue3开发环境的过程可以分为以下几个步骤: 1.安装Webpack和Vue3依赖 在开始使用Webpack搭建Vue3开发环境之前,我们需要先安装Webpack和Vue3的相关依赖。 Webpack是一个打包工具,可以将多个JavaScript、CSS、HTML等文件打包成一个或多个JavaScript文件。在搭建Vue3开发环境时,…

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