vue3的侦听器watch与watchEffect

本文深入探讨 Vue3 中的计算属性,通过示例展示如何使用 `ref` 和 `reactive` 创建响应式数据,并利用 `watch` 和 `watchEffect` 监听数据变化。同时,讲解了不同情况下 `watch` 的使用方式,包括监听单个、多个属性及深层次对象的变化。此外,还展示了如何在模板中动态更新和操作数据。
摘要由CSDN通过智能技术生成
<template>
    <div>
        <h1>计算属性</h1>
        <hr>
        <div>{{sum}}</div>
        <button @click="add">点我加1</button>
        <hr>
        <div>{{str}}</div>
        <button @click="addTanhao">点我加!</button>
        <div>{{person.name}}</div>
        <div>{{person.age}}</div>
        <div>{{person.job.jobName}}</div>
        <button @click="person.name+='~'">姓名加~</button>
        <button @click="person.age++">年龄加1</button>
        <button @click="person.job.jobName += '累'">工作名加累</button>
    </div>
</template>

<script>
import { reactive, ref } from "@vue/reactivity";
import { watch, watchEffect } from "@vue/runtime-core";
export default {
    name: "Vue3Study05Setup",
    setup() {
        let sum = ref(0);
        let str = ref("hello");

        let person = reactive({
            name: "lin",
            age: 18,
            job:{
              jobName:'前端'
            }
        });

        function add() {
            sum.value++;
        }
        function addTanhao() {
            str.value += "!";
        }

        // 情况1 watch监听ref定义的一个简单数据 => 立即监听(immediate)
        // watch(
        //     sum,
        //     (newValue, oldValue) => {
        //         console.log("数据变了", newValue, oldValue);
        //     },
        //     { immediate: true }
        // );

        // 情况2 watch监听ref定义的多个简单数据(第一个参数是数组) => 打印也是一个数组
        // watch([sum, str], (newValue, oldValue) => {
        //     console.log("数据变了", newValue, oldValue); // 数据变了 (2)[0, 'hello!'] (2)[0, 'hello']
        // });

        // 情况3 watch监听reactive定义的对象(全部属性)=> oldValue(没用)和newValue值一样
        // watch(person, (newValue, oldValue) => {
        //     console.log(newValue, oldValue);
        // });

        // 情况4 watch监听reactive定义的对象(某个属性),第一个参数必须是函数
        // watch(()=>person.name, (newValue, oldValue) => {
        //     console.log(newValue, oldValue);
        // });

        // 情况4 watch监听reactive定义的对象(多个属性),第一个参数必须是数组
        // watch([()=>person.name,()=>person.age], (newValue, oldValue) => {
        //     console.log(newValue, oldValue);
        // });

        // 情况5 watch监听reactive定义的对象(属性为深层次的对象),必须有第三参数(属性deep:true)
        // watch(()=>person.job, (newValue, oldValue) => {
        //     console.log(newValue, oldValue);
        // },{deep:true});
        
        // vue3中新的侦听器 watchEffect => 回调函数用到什么, 就监视什么
        // watchEffect(()=>{
        //   if(sum.value>1){
        //     alert('watchEffect 监视sum成功了')
        //   }
        //   console.log('watchEffect执行了',sum.value);
        // })

        /**
         * watch与watchEffect区别
         *    watch       =>  既要指明监视的属性, 也要指明监视的回调
         *    watchEffect =>  不用指明监视那个属性, 监视的回调中用到那个属性, 就监视那个属性
         * */ 


        return {
            sum,
            add,
            str,
            addTanhao,
            person,
        };
    },
};
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值