Vue3入门指北(十)侦听器

简介: Vue3入门指北(十)侦听器

前言


在某些场景下,我们可能需要监听某一地方的结果去修改另一个地方的状态。我们就可以通过使用watch()函数,来实现状态变化时,触发内部的回调函数。


watch()


在组合式API中,可以如下使用:


<script setup>
import { ref, watch } from 'vue'
const num = ref(0)
// 可以直接侦听一个 ref
watch(num, (newValue, oldValue) => {
  // 执行相应的操作
  ...
})
</script>
<template>
  <p>{{ num }}</p>
</template>
复制代码


当然你也可以监听计算属性、响应式对象或者getter函数,也可以监听多个数据源:


// 多个来源组成的数组
watch([x, () => y.value], ([newX, newY]) => {
  console.log(`x is ${newX} and y is ${newY}`)
})
复制代码


需要注意的一点是,不能把响应式对象的属性当作监听的数据源:


const math = reactive({ num: 0 })
watch(math.num, (value) => {
  console.log(`结果是:${value}`)
})
复制代码


如果想要监听的话,需要通过getter函数的形式:


watch(
  () => math.num,
  (value) => {
    console.log(`结果是:${value}`)
  }
)
复制代码


watchEffect()


熟悉vue2中的 watch 的同学,应该知道他是懒执行的,而vue3中也一样,只有当监听的数据源发生变化的时候,才会执行内部的回调。但是在某些情况下,我们可能需要在监听器创建时,执行一边回调。对于这种情况,我们就可以使用watchEffect()来解决。


const num = ref(0)
const busNum = ref(0)
function add() {
  busNum = num + 1
}
add()
watch(num, add)
复制代码


针对如上的情况,我们就可以通过watchEffect简化。watchEffect会立即执行一百年回调函数,并且自动追踪并分析出响应源。


watchEffect( () => {
  busNum = num + 1
})
复制代码


所以说,如上的例子中,回调会立即执行,并且会把num作为监听的数据源,在每次num更新的时候,其内部的回调会再次执行。


watchEffect只会追踪同步代码,并分析数据源。

相关文章
|
8天前
|
JavaScript
Vue3中路由跳转的语法
Vue3中路由跳转的语法
111 58
|
1天前
|
存储 API
vue3中如何动态自定义创建组件并挂载
vue3中如何动态自定义创建组件并挂载
|
7天前
|
JavaScript 索引
Vue 2和Vue 3的区别以及实现原理
Vue 2 的响应式系统通过Object.defineProperty来实现,它为对象的每个属性添加 getter 和 setter,以便追踪依赖并响应数据变化。
22 9
|
8天前
|
JavaScript 开发工具
vite如何打包vue3插件为JSSDK
【9月更文挑战第10天】以下是使用 Vite 打包 Vue 3 插件为 JS SDK 的步骤:首先通过 `npm init vite-plugin-sdk --template vue` 创建 Vue 3 项目并进入项目目录 `cd vite-plugin-sdk`。接着,在 `src` 目录下创建插件文件(如 `myPlugin.js`),并在 `main.js` 中引入和使用该插件。然后,修改 `vite.config.js` 文件以配置打包选项。最后,运行 `npm run build` 进行打包,生成的 `my-plugin-sdk.js` 即为 JS SDK,可在其他项目中引入使用。
|
6天前
|
JavaScript 调度
Vue3 使用 Event Bus
Vue3 使用 Event Bus
11 1
|
7天前
|
JavaScript
Vue3 : ref 与 reactive
Vue3 : ref 与 reactive
9 1
vue3 reactive数据更新,视图不更新问题
vue3 reactive数据更新,视图不更新问题
|
8天前
|
JavaScript
|
8天前
vue3定义暴露一些常量
vue3定义暴露一些常量
|
6天前
Vue3 使用mapState
Vue3 使用mapState
10 0