Vue中watchEffect和computed的应用方式

本文介绍了Vue中响应式原理的应用,包括使用ref和reactive创建响应式变量,通过watch和watchEffect监听变量变化,以及利用computed实现计算属性。并通过具体示例展示了如何在实际项目中运用这些技术。
<template>
    <div>
        <h2>{{counter}}</h2>
        <button @click="changeCounter"></button>
        <h3>{{user.name}}</h3>
        <button @click="cheangeUserName">改变user名字</button>
    </div>
</template>

<script >
// reactive可以引用对象类型
 import { reactive, computed } from 'vue';

export default{

    setup(props, context) {
        
        const counter = ref(0)
        function changeCounter(){
            counter.value++
        }
       
       const suser = reactive({
            name:"阿斯顿",
            age:10
        })

        function cheangeUserName(){
            user.name="李四"
        }
        //watch(侦听的响应式引用,回调函数)
        watch(counter,(newval,oldval)=>{
            console.log("newval-----------",newval);
            console.log("oldval-----------",oldval);
        })

        //watchEffect(回调函数)注意不需要指点监听属性,组件初始化的时候会执行一次回调,自动手机依赖
        watchEffect(()=>{
            console.log("newval-----------",newval);
            console.log("oldval-----------",oldval);
        })

        // watch和watchEffect的区别
        // 1.watchEffect不需要指定监听的属性,自动手机依赖,只要在回调中引用响应式的属性,只要这些属性发生改变,回调就会发生改变
        

        //computed的用法
        const msg = ref("helloworld")
        const reverseMsg=computed(()=>{
            return msg.value.split("").reverse().join("")
        })

        const user = reactive({
            name:"张三",
            age:44,
            reverseMsg:computed(()=>{
                return msg.value.split("").reverse().join("")
            })
        })
        return{counter,changeCounter,user}; 
    }
}
    

### 功能差异 在 Vue 中,`computed` `watch` 的主要功能差异在于它们的用途行为。`computed` 用于声明性地计算属性,其结果是一个值,并且基于其依赖的属性自动更新缓存。这意味着 `computed` 属性会在依赖的数据发生变化时重新计算,但在依赖不变的情况下直接返回缓存的结果,从而提高性能。相比之下,`watch` 用于观察数据的变化并执行副作用操作,功能更为灵活广泛。`watch` 不具备缓存机制,每次数据变化时都会触发对应的回调函数[^1]。 ### 使用场景 `computed` 更适合用于从一个或多个数据属性派生出一个新的属性,尤其是当这个计算过程是同步且需要缓存结果时。例如,可以使用 `computed` 来组合多个数据属性生成一个新的字符串,或者对数据进行简单的过滤格式化: ```javascript export default { data() { return { firstName: 'John', lastName: 'Doe' }; }, computed: { fullName() { return `${this.firstName} ${this.lastName}`; } } }; ``` 另一方面,`watch` 更适合处理需要在数据变化时执行异步操作、复杂逻辑或手动 DOM 操作的场景。例如,当需要在某个数据变化时发起网络请求、更新图表或进行复杂的计算时,可以使用 `watch`: ```javascript export default { data() { return { query: '' }; }, watch: { query(newVal) { this.search(newVal); } }, methods: { search(query) { // 模拟异步请求 setTimeout(() => { console.log(`Searching for: ${query}`); }, 500); } } }; ``` ### 性能表现 `computed` 属性具有缓存特性,只有在依赖的数据发生变化时才会重新计算,因此在性能要求较高的场景下更为高效。如果一个 `computed` 属性的依赖没有发生变化,Vue 会直接返回缓存的结果,而不会重新执行计算函数。这种机制可以有效减少不必要的重复计算,提高应用性能[^1]。 相比之下,`watch` 不具备缓存机制,每次数据变化时都会触发回调函数。虽然这使得 `watch` 更加灵活,但也可能导致性能问题,特别是在频繁修改监听数据的情况下。因此,在选择使用 `watch` 时,需要权衡其灵活性与性能影响。 ### 何时使用 `computed` 或 `watch` 选择使用 `computed` 还是 `watch` 主要取决于具体的需求。如果需要根据其他数据计算出一个新的值,并且该计算过程相对简单且同步,应优先使用 `computed`。而如果需要在数据变化时执行复杂操作或异步任务(如处理 AJAX 请求或直接操作 DOM),则更适合使用 `watch`。 例如,如果需要将多个数据属性组合成一个新的字符串,使用 `computed` 是更合适的选择。但如果需要在用户输入搜索关键词时发起网络请求,使用 `watch` 会更加直观灵活。 ### 相关问题 1. 如何在 Vue 中监听对象的某个嵌套属性变化? 2. Vue 中 `watch` 的 `deep` `immediate` 选项分别有什么作用? 3. Vue 3 中 `watch` 与 `watchEffect` 的区别是什么? 4. Vue 中如何监听数组的变化并触发 `watch` 回调?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值