10、Vue 3 (2024 版)基础笔记 - 侦听器

作者: 温新

图书: 【Vue 3 setup 使用实记】

阅读: 83

时间: 2024-05-19 02:24:54

Vue3 中的侦听器(Watcher)是用于监听特定数据源(如响应式数据、计算属性、getter 函数等)变化的工具,当这些数据发生变化时,侦听器会自动触发预设的回调函数。

Vue3 提供了两种主要的侦听器 API:watch()watchEffect()

准备工作

1、创建组件

src/components/WatchDemo.vue

<template></template>

<script setup lang="ts"></script>

2、引入组件

src/App.vue

<template>
    <WatchDemo/>
</template>

<script setup lang="ts">
    import WatchDemo from "@/components/WatchDemo.vue";
</script>

watch

src/components/WatchDemo.vue

<template>
    <button @click="clickHandler">换一个名称</button>
    <p>{{ message }}</p>
</template>

<script setup lang="ts">
    import {ref, watch} from 'vue'

    const message = ref('王美丽')
    const clickHandler = () => {
        message.value = '王丽丽'
    }

    /**
     * message 必须与监听数据的 message 名保持一致
     * newValue 新值
     * oldValue 旧值
     */
    watch(message, (newValue, oldValue) => {
        console.log(newValue, oldValue)
    })
</script>

watch() 函数用于精确监听一个或多个指定的数据源,并在这些数据源的值发生变更时执行回调函数。它接受两个主要参数:

  • source:要监听的数据源。可以是以下几种形式:
    • 单个响应式对象的属性引用(如 refreactive 对象的属性)。
    • 计算属性(一个返回值的函数)。
    • 一个返回值的 getter 函数。
    • 一个包含多个数据源的数组,用于同时监听多个数据源。
  • callback:当监听的数据源发生变化时执行的回调函数。回调接收两个参数:
    • newValue:新值。
    • oldValue:旧值。

watchEffect

src/components/WatchDemo.vue

<template>
    <div class="counter">
        <h2>计数器</h2>
        <p>当前计数:{{ count }}</p>
        <p>描述:{{ descriptiveMessage }}</p>
        <button @click="increment">增加计数</button>
    </div>
</template>

<script setup lang="ts">
import { ref, watchEffect, computed } from 'vue';

// 响应式状态:计数器值
const count = ref(0);

// 根据计数值计算描述性消息
const descriptiveMessage = computed( () => {
    if (count.value === 0) {
        return '计数尚未开始';
    } else if (count.value === 1) {
        return '已经计数一次';
    } else {
        return `已经计数 ${count.value} 次`;
    }
})


// 使用 watchEffect 监听 count 变化并更新描述性消息
watchEffect(() => {
    // 当内部访问到的响应式状态(如 count)发生变化时,此回调函数会自动重新执行
    const message = count.value
    console.log(message)
});

const increment = () => {
    count.value++;
}
</script>

watchEffect 一进来就会执行,这个打开 F12 就可以发现。

请登录后再评论