vue3.0中的watch偵聽(tīng)器實(shí)例詳解
前言
雖然計(jì)算屬性在大多數(shù)情況下更合適,但有時(shí)也需要一個(gè)自定義的偵聽(tīng)器。這就是為什么 Vue 通過(guò)watch選項(xiàng)提供了一個(gè)更通用的方法,來(lái)響應(yīng)數(shù)據(jù)的變化。當(dāng)需要在數(shù)據(jù)變化時(shí)執(zhí)行異步或開(kāi)銷(xiāo)較大的操作時(shí),這個(gè)方式是最有用的。
偵聽(tīng)器和計(jì)算屬性的區(qū)別
計(jì)算屬性里不可以做異步操作,偵聽(tīng)器可以做異步操作,相當(dāng)于計(jì)算屬性的升級(jí)版
vue3如何使用watch呢?
基本使用
<template> <h1>watch偵聽(tīng)器頁(yè)面</h1> <p>普通偵聽(tīng)數(shù)據(jù):{{ num }}</p> <button @click="butFn">點(diǎn)擊</button> </template>
script
import { ref, watch } from 'vue' // 記得用到什么就要導(dǎo)入什么vue3的新特性,按需調(diào)用 setup() { const num = ref(0) // watch(要偵聽(tīng)的數(shù)據(jù),回調(diào)函數(shù)) watch(num, (v1, v2) => { // v1 是改變以后的新值 // v2 是改變前的值 console.log(v1, v2) // 要點(diǎn):偵聽(tīng)普通函數(shù)可以獲取修改前后的值,被偵聽(tīng)的數(shù)據(jù)必須是響應(yīng)式的 }) // 單機(jī)事件 const butFn = () => { num.value++ } return { butFn, num } }
監(jiān)聽(tīng)多個(gè)響應(yīng)式數(shù)據(jù)
const num = ref(0) const num2 = ref(20) watch([num, num2], (v1, v2) => { // 存入的結(jié)果是一個(gè)數(shù)組,結(jié)果返回的也是一個(gè)已數(shù)組格式的結(jié)果 // v1是最新結(jié)果的數(shù)組 // v2是舊數(shù)據(jù)的數(shù)組 console.log('v1', v1, 'v2', v2) // 總結(jié):可以得到更新前后的值,偵聽(tīng)的結(jié)果也是數(shù)組數(shù)據(jù)順序一致 })
偵聽(tīng)reactive定義的響應(yīng)式數(shù)據(jù)
const obj = reactive({ msg: '奇奇怪怪可可愛(ài)愛(ài)' }) watch(obj, () => { // 只能獲取到最新的值 console.log(obj.msg) })
總結(jié):如果偵聽(tīng)對(duì)象,那么偵聽(tīng)器的回調(diào)函數(shù)的兩個(gè)參數(shù)是一樣的結(jié)果,表示最新的對(duì)象數(shù)據(jù),此時(shí)也可以直接讀取被偵聽(tīng)的對(duì)象,那么得到的值也是最新的。
監(jiān)聽(tīng)reactive定義的響應(yīng)式數(shù)據(jù)的某一個(gè)屬性
const obj = reactive({ msg: '奇奇怪怪可可愛(ài)愛(ài)' }) watch(() => obj.msg,(v1, v2) => { // v1 就是被監(jiān)聽(tīng)數(shù)據(jù)的最新值 // v2 就是被監(jiān)聽(tīng)數(shù)據(jù)的原有值 console.log(v1, v2) // 總結(jié):如果偵聽(tīng)對(duì)象中當(dāng)個(gè)屬性,需要使用箭頭函數(shù)的方式 // 偵聽(tīng)更少的數(shù)據(jù)有利于提高性能 } )
配置選項(xiàng)用法
const obj = reactive({ msg: { info: 'ooo' } }) watch(() => obj.msg,(v1, v2) => { console.log(v1, v2) }, { // 首次渲染組件就觸發(fā)一次 immediate: true, // 開(kāi)啟深度監(jiān)聽(tīng),對(duì)象里面的數(shù)據(jù)如果發(fā)生變化也會(huì)被偵聽(tīng)到 // 如果監(jiān)聽(tīng)的數(shù)據(jù)是一個(gè)比較長(zhǎng)的表達(dá)式,那么需要用一個(gè)函數(shù)的方式 // 但是寫(xiě)成函數(shù)形式之后,里層的數(shù)據(jù)變化不到,所以需要添加deep選項(xiàng) deep: true } )
總結(jié)
到此這篇關(guān)于vue3.0中watch偵聽(tīng)器實(shí)例詳解的文章就介紹到這了,更多相關(guān)vue3.0 watch偵聽(tīng)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
element plus中el-upload實(shí)現(xiàn)上傳多張圖片的示例代碼
最近寫(xiě)項(xiàng)目的時(shí)候需要一次上傳多張圖片,本文主要介紹了element plus中el-upload實(shí)現(xiàn)上傳多張圖片的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01vue3 與 vue2 優(yōu)點(diǎn)對(duì)比匯總
隨著用vue3 的開(kāi)發(fā)者越來(lái)越多,其必定是又她一定的有帶你,接下來(lái)這篇文章小編就為大家介紹vue3 對(duì)比 vue2 有什么優(yōu)點(diǎn)?感興趣的小伙伴請(qǐng)跟小編一起閱讀下文吧2021-09-09VUE2實(shí)現(xiàn)事件驅(qū)動(dòng)彈窗示例
本篇文章主要介紹了VUE2實(shí)現(xiàn)事件驅(qū)動(dòng)彈窗示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Vue項(xiàng)目如何部署到Tomcat服務(wù)器上
這篇文章主要介紹了Vue項(xiàng)目如何部署到Tomcat服務(wù)器上,Vue中自帶webpack,可以通過(guò)一行命令將項(xiàng)目打包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03動(dòng)畫(huà)詳解Vue3的Composition?Api
為讓大家更好的理解Vue3的Composition?Api本文采用了詳細(xì)的動(dòng)畫(huà)演繹,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Element-ui 滾動(dòng)條美化的實(shí)現(xiàn)
本文主要介紹了Element-ui 滾動(dòng)條美化的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06vue中v-for循環(huán)給標(biāo)簽屬性賦值的方法
這篇文章主要介紹了vue中v-for循環(huán)給標(biāo)簽屬性賦值的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10