Vue3 计算属性,监听属性

本文详细介绍了Vue.js中计算属性`computed`和监听属性`watch`的用法,包括它们的定义、参数及不同用例。计算属性在依赖值变化时自动更新,而监听属性则允许自定义更新逻辑。此外,还提到了`watchEffect`的使用,它会在依赖变化时立即执行并响应式追踪。文章涵盖了这些概念的基本用法和高级特性,如清除副作用、更新时机等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算属性,监听属性

1、计算属性computed:当以来的属性发生变化时,就会触发他更改;若依赖的值不发生改变,则使用缓存中的值。

语法:

import { ref, computed } from 'vue';
let price = ref<number | string>(1);
// 函数写法
let com = computed<string>(() => {
    return '$' + price.value;
});
// 对象写法
let com1 = computed({
    get: () => {
        return price.value;
    },
    set: val => {
        price.value = '$' + val;
    },
});

2、监视属性watch:接收三个参数(第一个参数监视的属性/对象,第二个参数回调函数,第三个参数配置对象)

监视ref

import { ref, watch } from 'vue';
// 监视一个ref属性,newVal、oldVal与监视的值保持一直
let price = ref<number | string>(1);
watch(price, (newVal, oldVal) => {
    console.log(newVal);
    console.log(oldVal);
});
// 监视多个ref属性,newVal、oldVal是一个数组
let price = ref<number | string>(1);
let price1 = ref<number | string>(1);
watch([price, price1], (newVal, oldVal) => {
    console.log(newVal);
    console.log(oldVal);
});
//监视一个ref对象
let message = ref({
    nav: {
        bar: {
            name: 'zhangsan',
        },
    },
});
watch(
    message,
    (newVal, oldVal) => {
        console.log(newVal, oldVal);
    },
    {
        immediate: true,// 初始化就开启监视
        deep: true,// 开启深度监视
    }
);

监视reactive

注意:当监听值为proxy对象时,oldValue值将出现异常,此时与newValue相同

import { reactive, watch } from 'vue';
// 监视一个reactive对象,监视reactive对象默认就会开启深度监视
let message = reactive({
    nav: {
        bar: {
            name: 'zhangsan',
        },
    },
});
watch(message, (newVal, oldVal) => {
    console.log(newVal, oldVal);
});
// 监视reactive对象中的某个属性
watch(
    () => message.nav.bar.name,
    (newVal, oldVal) => {
        console.log(newVal, oldVal);
    }
);

3、watchEffect:立即执行传入的函数,同时响应式追踪其依赖,依赖发生改变时立马执行该函数。

  1. 清除副作用:就是在触发监听之前会调用一个函数可以处理你的逻辑例如防抖

    import { watchEffect, ref } from 'vue'
    let message = ref<string>('')
    let message2 = ref<string>('')
     watchEffect((oninvalidate) => {
        //console.log('message', message.value);
        oninvalidate(()=>{
            // 回调函数,先执行这个里面的内容
        })
        console.log('message2', message2.value);
    })
    
  2. 停止跟踪 watchEffect 返回一个函数 调用之后将停止更新

    const stop =  watchEffect((oninvalidate) => {
        //console.log('message', message.value);
        oninvalidate(()=>{
     
        })
        console.log('message2', message2.value);
    },{
        flush:"post",//设置为post,可以在watch里获取dom元素
        onTrigger () {
     		//调试debugger
        }
    })
    stop()
    
  3. 副作用刷新时机flush

    flush的取值:pre(组件更新前执行)、sync(强制效果始终同步触发)、post(组件更新后执行)

### Vue3监听对象属性值变化的方法 在 Vue3 中,可以通过 `watch` 方法来监听对象及其嵌套属性的变化。为了实现深度监听(即当对象内部任意层次的属性发生改变时都能触发回调),可以利用组合式 API 提供的功能。 以下是具体实现方式: #### 使用 `reactive` 和 `watch` 如果目标是一个由 `reactive` 创建的对象,则可以直接使用 `watch` 并设置 `{ deep: true }` 参数来进行深度监听[^2]。 ```javascript import { reactive, watch } from &#39;vue&#39;; const state = reactive({ user: { name: &#39;Alice&#39;, age: 25, address: { city: &#39;Beijing&#39; } } }); // 深度监听整个 user 对象 watch( () => state.user, (newVal, oldVal) => { console.log(&#39;User object changed:&#39;, newVal, oldVal); }, { deep: true } // 启用深度监听 ); ``` 在此示例中,无论是 `state.user.name` 还是 `state.user.address.city` 的更改都会触发回调函数。 #### 使用 `ref` 和 `watchEffect` 对于单层结构或者简单类型的变量推荐使用 `ref` 来定义响应式数据。然而,若要监控复杂对象中的某个特定路径或多个依赖项,则可考虑结合 `computed` 或者直接采用 `watchEffect` 自动追踪所有引用的数据源。 ```javascript import { ref, watchEffect } from &#39;vue&#39;; let obj = ref({ a: { b: 1 } }); watchEffect(() => { console.log(obj.value.a.b); // 当obj.a.b 发生任何变动都将重新执行此effect }); ``` 注意,在某些情况下可能需要手动停止副作用效果以防止内存泄漏等问题出现[^1]。 #### 总结 通过以上两种主要途径——基于 `reactive` 结合显式的 `deep:true` 配置以及运用 `ref` 加上隐含跟踪机制 (`watchEffect`) —— 可有效达成对 vue 组件内状态管理下各类形式对象成员变更事件捕捉需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hoki802

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值