浅析vue中computed,method,watch,watchEffect的区别

  • 方法methods只要调用每次都会执行
  • watch(惰性)只有依赖项更新才会执行回调函数,且组件初次渲染不会执行
  • watchEffect:自动追踪依赖变化,只要依赖更新即执行回调函数,且组件初次渲染即执行回调函数
  • computed(惰性): 返回一个只读的ref,具有缓存功能,只有依赖项更新才执行回调函数,且组件初次渲染即执行回调函数
javascript 复制代码
<template>
    <section class="demo-wrap">
        <el-button @click="handleClick">{{ state.count }}</el-button>
        <h1>{{ msg }}</h1>
        <el-button @click="handleNameClick">{{ name }}</el-button>
    </section>
</template>

<script setup>
import { ref, reactive, computed, watch, watchEffect } from 'vue'

const state = reactive({ count: 0 })

const text = ref('i am 20 years old !')

const name = ref('Eason')

// 方法只要调用每次都会执行
const handleClick = () => {
    state.count++
    name.value = `Hello - ${Math.random()}`
    text.value = 'Beijing'
}

const handleNameClick = () => {
    name.value = 'Christina'
    console.log('changed name is: ', name.value)
}

// watch(): 侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数
// 需要显示指定要监听的属性,当属性值更新时,执行回调函数
// 可以获取属性原来的值
// 组件初次渲染时不会执行(惰性),只有当监听的值发生改变时,回调函数才会执行
// 如果想要组件第一次渲染时执行回调函数,须添加属性:immediate: true(变为非惰性)
watch(() => state.count, (val, preVal) => {
    console.log('val is :', val)
    console.log('preVal is :', preVal)
})

// 监听ref
watch(text, (val, preVal) => {
    console.log('val is: ', val)
    console.log('preVal is: ', preVal)
})

// 监听多个数据源
watch([text, name], ([text, name], [preText, preName]) => {
    console.log('new val: ', text, name)
    console.log('old val: ', preText, preName)
})

// watchEffect(): 立即运行一个函数,同时响应式地追踪其依赖,并在依赖更改时重新执行。
// watch的副作用形式,不用显示指定要监听的属性
// 只要回调函数体中的变量更新, 就会执行回调函数
// 组件初次渲染时会自动执行
watchEffect(() => {
    // 立即运行
    const changedName = name.value
    console.log(`name has changed to ${changedName}`)
})

// 停止监听
const stop = watchEffect(() => {})
stop()

// 计算属性惰性(缓存功能),只有依赖项发生改变时即执行回调函数
// 依赖项不改变,不会执行回调函数
// 组件初次渲染时就会执行
const msg = computed(() => {
    return text.value.toUpperCase()
})

</script>
相关推荐
Mintopia7 分钟前
🎨 AIGC 内容过滤技术:当创作的洪流遇上理性的堤坝
前端·javascript·aigc
Shi_haoliu22 分钟前
Vue2 + Office Add-in关于用vue项目于加载项控制excel单元格内容(Demo版)
前端·javascript·vue.js·node.js·html·excel·office
计算机毕业设计木哥1 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的爱心公益网站
java·开发语言·vue.js·spring boot·后端·课程设计
aesthetician4 小时前
Node.js v25 重磅发布!革新与飞跃:深入探索 JavaScript 运行时的未来
javascript·node.js·vim
知识分享小能手7 小时前
uni-app 入门学习教程,从入门到精通,uni-app基础扩展 —— 详细知识点与案例(3)
vue.js·学习·ui·微信小程序·小程序·uni-app·编程
demi_meng8 小时前
reactNative 遇到的问题记录
javascript·react native·react.js
MC丶科8 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君20168 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
90后的晨仔11 小时前
Pinia 状态管理原理与实战全解析
前端·vue.js
EndingCoder11 小时前
WebSocket实时通信:Socket.io
服务器·javascript·网络·websocket·网络协议·node.js