vue3中的watch和watchEffect实例详解

yizhihongxing

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.js中this.$emit的深入理解

    对于Vue.js中的this.$emit方法的深入理解,需要从Vue.js组件通信的机制以及this指向这两个方面来展开讲解。 一、Vue.js组件通信机制 在Vue.js中,组件之间的通信可以通过props和自定义事件来实现。 1. 通过props进行父子组件通信 父组件通过props向子组件传递数据,子组件可以接收到父组件传递进来的数据,并且在子组件中将…

    Vue 2023年5月28日
    00
  • JavaScript设计模式之原型模式分析【ES5与ES6】

    JavaScript设计模式之原型模式分析【ES5与ES6】 什么是原型模式? 在JavaScript中,每个对象都有原型(prototype)属性。原型是一个对象,其他对象可以通过它来继承属性和方法。原型模式就是通过原型来创建新对象的模式。 原型模式是一种创建型设计模式,它允许我们通过克隆现有对象的方式来创建新对象,而不是通过使用构造函数创建。 实现原型模…

    Vue 2023年5月28日
    00
  • 动态加载权限管理模块中的Vue组件

    动态加载权限管理模块中的Vue组件可以分为以下几个步骤: 1. 在项目中定义Vue组件 首先需要在项目中定义需要动态加载的Vue组件,这个组件可以定义在任何一个.vue文件中,比如我们定义了一个组件叫做PermissionSetting.vue。 <template> <div> <!– 组件代码 –> </di…

    Vue 2023年5月28日
    00
  • vue项目常用组件和框架结构介绍

    下面我将为你详细讲解”vue项目常用组件和框架结构介绍”的攻略。 1. 常用组件 在Vue项目开发中,常用的组件有: (1) vue-router 路由是Vue应用中最重要的一部分,它可以帮助我们实现单页应用页面之间的跳转。vue-router是Vue官方提供的路由器,它能轻松地与Vue应用进行整合,可以实现前端路由的效果。 (2) vuex Vuex是一种…

    Vue 2023年5月28日
    00
  • 使用vite创建vue3项目的详细图文教程

    以下是使用vite创建vue3项目的详细攻略: 准备工作 首先确保你已经安装了Node.js环境以及NPM包管理器。 安装vite脚手架工具,运行以下命令: npm install -g create-vite-app 创建项目 创建一个新的Vue3项目,建立一个新的文件夹并进入该文件夹,运行以下命令: create-vite-app my-vue3-pro…

    Vue 2023年5月28日
    00
  • 浅谈Vue3.0新版API之composition-api入坑指南

    浅谈Vue3.0新版API之composition-api入坑指南 随着Vue3.0版本的发布,新版API也推出了许多新特性,其中最为引人注目的便是composition-api。如何使用新特性,帮助开发者更高效地编写Vue应用,将是本文所要探讨的内容。 什么是composition-api composition-api是Vue3.0版本全新的特性,它是一…

    Vue 2023年5月27日
    00
  • vue中常见的问题及解决方法总结(推荐)

    Vue中常见问题及解决方法总结 1. Vue中常见问题 1.1. Vue组件之间通信 在Vue中,通信是组件之间的一个重要问题。通信包括父子组件之间的通信、兄弟组件之间的通信,还有隔代组件之间的通信等。通信方式有很多种,包括props/$emit、$parent/$children、事件总线、Vuex等。 1.1.1. Props/$emit Props/$…

    Vue 2023年5月27日
    00
  • 解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)

    下面是解决Vue中this.$forceUpdate()处理页面刷新问题的攻略,步骤如下: 1. 确认是否需要使用this.$forceUpdate() Vue.js是一款响应式的框架,因此它能准确地知道所需渲染的组件和组件之间的数据关系。当你的模板中发生数据变化时,Vue会自动侦测到并更新视图,不需要手动触发刷新。但是有时候我们面临的问题需要手动强制刷新页…

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