vue3中watch監(jiān)聽(tīng)的四種寫(xiě)法
作用:監(jiān)視數(shù)據(jù)的變化(和vue2中的watch作用一致)
特點(diǎn):vue3中watch只能監(jiān)視以下四種數(shù)據(jù):
1、ref 定義的數(shù)據(jù)
2、reactive定義的數(shù)據(jù)
3、函數(shù)返回的值(getter函數(shù))
4、前面3個(gè)內(nèi)容的數(shù)組
寫(xiě)法
情況一
監(jiān)視r(shí)ef定義的基本數(shù)據(jù)類型:直接寫(xiě)數(shù)據(jù)名即可,監(jiān)視的是value值的改變
<template> <div class="person"> <h1>情況一:監(jiān)視【ref】定義的【基本類型】數(shù)據(jù)</h1> <h2>當(dāng)前求和為:{{sum}}</h2> <button @click="changeSum">點(diǎn)我sum+1</button> </div> </template> <script lang="ts" setup name="Person"> import {ref,watch} from 'vue' // 數(shù)據(jù) let sum = ref(0) // 方法 function changeSum(){ sum.value += 1 } // 監(jiān)視,情況一:監(jiān)視【ref】定義的【基本類型】數(shù)據(jù) const stopWatch = watch(sum,(newValue,oldValue)=>{ console.log('sum變化了',newValue,oldValue) //newValue是新的數(shù)據(jù),oldvalue是舊的數(shù)據(jù) if(newValue >= 10){ stopWatch() } }) </script>
情況二
監(jiān)視r(shí)ef定義的【對(duì)象類型】數(shù)據(jù):直接寫(xiě)數(shù)據(jù)名,監(jiān)視的是對(duì)象的【地址值】,若想監(jiān)視對(duì)象內(nèi)部的數(shù)據(jù),要手動(dòng)開(kāi)啟深度監(jiān)視。
<template> <div class="person"> <h1>情況二:監(jiān)視【ref】定義的【對(duì)象類型】數(shù)據(jù)</h1> <h2>姓名:{{ person.name }}</h2> <h2>年齡:{{ person.age }}</h2> <button @click="changeName">修改名字</button> <button @click="changeAge">修改年齡</button> <button @click="changePerson">修改整個(gè)人</button> </div> </template> <script lang="ts" setup name="Person"> import {ref,watch} from 'vue' // 數(shù)據(jù) let person = ref({ name:'張三', age:18 }) // 方法 function changeName(){ person.value.name += '~' } function changeAge(){ person.value.age += 1 } function changePerson(){ person.value = {name:'李四',age:90} } /* 監(jiān)視,情況一:監(jiān)視【ref】定義的【對(duì)象類型】數(shù)據(jù),監(jiān)視的是對(duì)象的地址值,若想監(jiān)視對(duì)象內(nèi)部屬性的變化,需要手動(dòng)開(kāi)啟深度監(jiān)視 watch的第一個(gè)參數(shù)是:被監(jiān)視的數(shù)據(jù) watch的第二個(gè)參數(shù)是:監(jiān)視的回調(diào) watch的第三個(gè)參數(shù)是:配置對(duì)象(deep、immediate等等.....) */ watch(person,(newValue,oldValue)=>{ console.log('person變化了',newValue,oldValue) },{deep:true}) </script>
情況三
監(jiān)視r(shí)eactive定義的【對(duì)象類型】數(shù)據(jù),且默認(rèn)開(kāi)啟了深度監(jiān)視。
<template> <div class="person"> <h1>情況三:監(jiān)視【reactive】定義的【對(duì)象類型】數(shù)據(jù)</h1> <h2>姓名:{{ person.name }}</h2> <h2>年齡:{{ person.age }}</h2> <button @click="changeName">修改名字</button> <button @click="changeAge">修改年齡</button> <button @click="changePerson">修改整個(gè)人</button> <hr> <h2>測(cè)試:{{obj.a.b.c}}</h2> <button @click="test">修改obj.a.b.c</button> </div> </template> <script lang="ts" setup name="Person"> import {reactive,watch} from 'vue' // 數(shù)據(jù) let person = reactive({ name:'張三', age:18 }) let obj = reactive({ a:{ b:{ c:666 } } }) // 方法 function changeName(){ person.name += '~' } function changeAge(){ person.age += 1 } function changePerson(){ Object.assign(person,{name:'李四',age:80}) } function test(){ obj.a.b.c = 888 } // 監(jiān)視,情況三:監(jiān)視【reactive】定義的【對(duì)象類型】數(shù)據(jù),且默認(rèn)是開(kāi)啟深度監(jiān)視的 watch(person,(newValue,oldValue)=>{ console.log('person變化了',newValue,oldValue) }) watch(obj,(newValue,oldValue)=>{ console.log('Obj變化了',newValue,oldValue) }) </script>
情況四
監(jiān)視r(shí)ef或reactive定義的【對(duì)象類型】數(shù)據(jù)中的某個(gè)屬性,注意點(diǎn)如下:
若該屬性值不是【對(duì)象類型】,需要寫(xiě)成函數(shù)形式。
若該屬性值是依然是【對(duì)象類型】,可直接編,也可寫(xiě)成函數(shù),建議寫(xiě)成函數(shù)。
結(jié)論:監(jiān)視的要是對(duì)象里的屬性,那么最好寫(xiě)函數(shù)式,注意點(diǎn):若是對(duì)象監(jiān)視的是地址值,需要關(guān)注對(duì)象內(nèi)部,需要手動(dòng)開(kāi)啟深度監(jiān)視。
<template> <div class="person"> <h1>情況四:監(jiān)視【ref】或【reactive】定義的【對(duì)象類型】數(shù)據(jù)中的某個(gè)屬性</h1> <h2>姓名:{{ person.name }}</h2> <h2>年齡:{{ person.age }}</h2> <h2>汽車(chē):{{ person.car.c1 }}、{{ person.car.c2 }}</h2> <button @click="changeName">修改名字</button> <button @click="changeAge">修改年齡</button> <button @click="changeC1">修改第一臺(tái)車(chē)</button> <button @click="changeC2">修改第二臺(tái)車(chē)</button> <button @click="changeCar">修改整個(gè)車(chē)</button> </div> </template> <script lang="ts" setup name="Person"> import {reactive,watch} from 'vue' // 數(shù)據(jù) let person = reactive({ name:'張三', age:18, car:{ c1:'奔馳', c2:'寶馬' } }) // 方法 function changeName(){ person.name += '~' } function changeAge(){ person.age += 1 } function changeC1(){ person.car.c1 = '奧迪' } function changeC2(){ person.car.c2 = '大眾' } function changeCar(){ person.car = {c1:'雅迪',c2:'愛(ài)瑪'} } // 監(jiān)視,情況四:監(jiān)視響應(yīng)式對(duì)象中的某個(gè)屬性,且該屬性是基本類型的,要寫(xiě)成函數(shù)式 /* watch(()=> person.name,(newValue,oldValue)=>{ console.log('person.name變化了',newValue,oldValue) }) */ // 監(jiān)視,情況四:監(jiān)視響應(yīng)式對(duì)象中的某個(gè)屬性,且該屬性是對(duì)象類型的,可以直接寫(xiě),也能寫(xiě)函數(shù),更推薦寫(xiě)函數(shù) watch(()=>person.car,(newValue,oldValue)=>{ console.log('person.car變化了',newValue,oldValue) },{deep:true}) </script>
情況五
監(jiān)視多個(gè)數(shù)據(jù)
<template> <div class="person"> <h1>情況五:監(jiān)視上述的多個(gè)數(shù)據(jù)</h1> <h2>姓名:{{ person.name }}</h2> <h2>年齡:{{ person.age }}</h2> <h2>汽車(chē):{{ person.car.c1 }}、{{ person.car.c2 }}</h2> <button @click="changeName">修改名字</button> <button @click="changeAge">修改年齡</button> <button @click="changeC1">修改第一臺(tái)車(chē)</button> <button @click="changeC2">修改第二臺(tái)車(chē)</button> <button @click="changeCar">修改整個(gè)車(chē)</button> </div> </template> <script lang="ts" setup name="Person"> import {reactive,watch} from 'vue' // 數(shù)據(jù) let person = reactive({ name:'張三', age:18, car:{ c1:'奔馳', c2:'寶馬' } }) // 方法 function changeName(){ person.name += '~' } function changeAge(){ person.age += 1 } function changeC1(){ person.car.c1 = '奧迪' } function changeC2(){ person.car.c2 = '大眾' } function changeCar(){ person.car = {c1:'雅迪',c2:'愛(ài)瑪'} } // 監(jiān)視,情況五:監(jiān)視上述的多個(gè)數(shù)據(jù) watch([()=>person.name,person.car],(newValue,oldValue)=>{ console.log('person.car變化了',newValue,oldValue) },{deep:true}) </script>
到此這篇關(guān)于vue3中warch監(jiān)聽(tīng)的幾種寫(xiě)法的文章就介紹到這了,更多相關(guān)vue3 warch監(jiān)聽(tīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文詳解Vue3的watch是如何實(shí)現(xiàn)監(jiān)聽(tīng)的
- Vue3中watch監(jiān)聽(tīng)的五種情況詳解
- Vue3.0監(jiān)聽(tīng)器watch與watchEffect詳解
- Vue3中watch無(wú)法監(jiān)聽(tīng)的解決辦法
- Vue3?Watch踩坑實(shí)戰(zhàn)之watch監(jiān)聽(tīng)無(wú)效
- 詳解Vue3中Watch監(jiān)聽(tīng)事件的使用
- vue3界面使用router及使用watch監(jiān)聽(tīng)router的改變
- Vue3中watch監(jiān)聽(tīng)使用詳解
- 詳解vue3中watch監(jiān)聽(tīng)的幾種情況
相關(guān)文章
詳解如何使用vue實(shí)現(xiàn)頁(yè)面訪問(wèn)攔截
這篇文章主要為大家詳細(xì)介紹了如何使用vue實(shí)現(xiàn)頁(yè)面訪問(wèn)攔截功能,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下2023-08-08Vue集成three.js并加載glb、gltf、FBX、json模型的場(chǎng)景分析
這篇文章主要介紹了Vue集成three.js,并加載glb、gltf、FBX、json模型,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09Vue中keep-alive 實(shí)現(xiàn)后退不刷新并保持滾動(dòng)位置
這篇文章主要介紹了Vue中keep-alive 實(shí)現(xiàn)后退不刷新并保持滾動(dòng)位置的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03vue打包的時(shí)候自動(dòng)將px轉(zhuǎn)成rem的操作方法
這篇文章主要介紹了vue打包的時(shí)候自動(dòng)將px轉(zhuǎn)成rem的操作方法,需要的朋友可以參考下2018-06-06vue實(shí)現(xiàn)行列轉(zhuǎn)換的一種方法
這篇文章主要介紹了vue實(shí)現(xiàn)行列轉(zhuǎn)換的一種方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08在vue.js渲染完界面之后如何再調(diào)用函數(shù)
這篇文章主要介紹了在vue.js渲染完界面之后如何再調(diào)用函數(shù)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07