詳解vue3中watch監(jiān)聽(tīng)的幾種情況
一、監(jiān)聽(tīng)ref創(chuàng)建的基本數(shù)據(jù)類(lèi)型
watch的第一個(gè)參數(shù)直接寫(xiě)需要監(jiān)聽(tīng)的數(shù)據(jù)名即可,監(jiān)聽(tīng)的是其值的變化
<div>
<h1>情況一:監(jiān)視【ref】定義的【基本類(lèi)型】數(shù)據(jù)</h1>
<h2>當(dāng)前求和為:{{ sum }}</h2>
<el-button @click="changeSum">點(diǎn)我sum+1</el-button>
</div>
// 數(shù)據(jù)
let sum = ref(0)
// 方法
function changeSum() {
sum.value += 1
}
// 監(jiān)視,情況一:監(jiān)視【ref】定義的【基本類(lèi)型】數(shù)據(jù)
const stopWatch = watch(sum, (newValue, oldValue) => {
console.log('sum變化了', newValue, oldValue)
if (newValue >= 10) {
stopWatch()
}
})二、監(jiān)聽(tīng)ref創(chuàng)建的對(duì)象類(lèi)型
watch監(jiān)聽(tīng)person時(shí),監(jiān)聽(tīng)的是person的地址值,只有當(dāng)person的引用地址發(fā)生變化時(shí)才能監(jiān)聽(tīng)得到,當(dāng)寫(xiě)成Object.assign(person.value, { name: '李四', age: 90, son: { age: 5 } })時(shí)依然監(jiān)聽(tīng)不到
當(dāng)開(kāi)啟deep: true時(shí),無(wú)論修改person中的哪個(gè)參數(shù),包括son對(duì)象,都能監(jiān)聽(tīng)得到
<div>
<h1>情況二:監(jiān)視【ref】定義的【對(duì)象類(lèi)型】數(shù)據(jù)</h1>
<h2>姓名:{{ person.name }}</h2>
<h2>年齡:{{ person.age }}</h2>
<h2>兒子年齡:{{ person.son.age }}</h2>
<el-button @click="changeName">修改名字</el-button>
<el-button @click="changeAge">修改年齡</el-button>
<el-button @click="changePerson">修改整個(gè)人</el-button>
<el-button @click="changeSonAge">修改兒子年齡</el-button>
</div>
// 數(shù)據(jù)
let person = ref({
name: '張三',
age: 18,
son: { age: 5 }
})
// 方法
function changeName() {
person.value.name += '~'
}
function changeAge() {
person.value.age += 1
}
function changePerson() {
person.value = { name: '李四', age: 90, son: { age: 5 } }
}
function changeSonAge() {
person.value.son.age += 1
}
watch(
person,
(newValue, oldValue) => {
console.log('person變化了', newValue, oldValue)
},
{ deep: true }
)三、監(jiān)聽(tīng)reactive定義的對(duì)象類(lèi)型數(shù)據(jù),會(huì)默認(rèn)開(kāi)啟深度監(jiān)聽(tīng)
前面提到,如果是監(jiān)聽(tīng)ref創(chuàng)建的對(duì)象類(lèi)型數(shù)據(jù),需要手動(dòng)開(kāi)啟深度監(jiān)聽(tīng),而監(jiān)聽(tīng)reactive創(chuàng)建的對(duì)象類(lèi)型數(shù)據(jù)時(shí),會(huì)自動(dòng)開(kāi)啟深度監(jiān)聽(tīng)
<div>
<h1>情況三:監(jiān)視【reactive】定義的【對(duì)象類(lèi)型】數(shù)據(jù)</h1>
<h2>姓名:{{ person.name }}</h2>
<h2>年齡:{{ person.age }}</h2>
<el-button @click="changeName">修改名字</el-button>
<el-button @click="changeAge">修改年齡</el-button>
<el-button @click="changePerson">修改整個(gè)人</el-button>
<hr />
<h2>測(cè)試:{{ obj.a.b.c }}</h2>
<el-button @click="test">修改obj.a.b.c</el-button>
</div>
// 數(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ì)象類(lèi)型】數(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)
})四、監(jiān)聽(tīng)ref或reactive定義的對(duì)象類(lèi)型中的某個(gè)屬性
監(jiān)聽(tīng)的是對(duì)象的基本類(lèi)型數(shù)據(jù),要寫(xiě)成函數(shù)形式
監(jiān)聽(tīng)的是對(duì)象的對(duì)象類(lèi)型數(shù)據(jù),可以寫(xiě)成函數(shù)形式,也可以直接寫(xiě)
監(jiān)聽(tīng)的是對(duì)象的對(duì)象類(lèi)型數(shù)據(jù),并且改變對(duì)象時(shí)改變了應(yīng)用地址,例如person.car = { ... },就必須要寫(xiě)成函數(shù)形式
<div>
<h1>情況四:監(jiān)視【ref】或【reactive】定義的【對(duì)象類(lèi)型】數(shù)據(jù)中的某個(gè)屬性</h1>
<h2>姓名:{{ person.name }}</h2>
<h2>年齡:{{ person.age }}</h2>
<h2>汽車(chē):{{ person.car.c1 }}、{{ person.car.c2 }}</h2>
<el-button @click="changeName">修改名字</el-button>
<el-button @click="changeAge">修改年齡</el-button>
<el-button @click="changeC1">修改第一臺(tái)車(chē)</el-button>
<el-button @click="changeC2">修改第二臺(tái)車(chē)</el-button>
<el-button @click="changeCar">修改整個(gè)車(chē)</el-button>
</div>
// 數(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)瑪' }
Object.assign(person.car, { c1: '雅迪', c2: '愛(ài)瑪' })
}
// 監(jiān)視,情況四:監(jiān)視響應(yīng)式對(duì)象中的某個(gè)屬性,且該屬性是基本類(lèi)型的,要寫(xiě)成函數(shù)式
watch(
() => person.name,
(newValue, oldValue) => {
console.log('person.name變化了', newValue, oldValue)
}
)
watch(
() => person.car, // 如果使用 person.car = { ... } 必須要使用函數(shù)寫(xiě)法;如果使用Object.assign,可以直接寫(xiě)person.car
(newValue, oldValue) => {
console.log('person.car變化了', newValue, oldValue)
},
{ deep: true }
)如果需要監(jiān)聽(tīng)多個(gè)數(shù)據(jù),可以將2個(gè)watch合并為一個(gè):
watch(
[() => person.name, () => person.car],
(newValue, oldValue) => {
console.log('person.car變化了', newValue, oldValue)
},
{ deep: true }
)總結(jié):
監(jiān)聽(tīng)ref創(chuàng)建的基本數(shù)據(jù)類(lèi)型,必須直接寫(xiě),不可以寫(xiě)成函數(shù)形式
監(jiān)聽(tīng)ref創(chuàng)建的對(duì)象數(shù)據(jù)類(lèi)型,可以直接寫(xiě),也可以寫(xiě)成函數(shù)形式,需要開(kāi)啟deep: true
監(jiān)聽(tīng)reactive創(chuàng)建的對(duì)象數(shù)據(jù)類(lèi)型,必須直接寫(xiě),不可以寫(xiě)成函數(shù)形式,默認(rèn)開(kāi)啟了deep: true
監(jiān)聽(tīng)ref或reactive創(chuàng)建的對(duì)象類(lèi)型中的某個(gè)屬性,該類(lèi)型為基本數(shù)據(jù)類(lèi)型,必須寫(xiě)成函數(shù)形式
監(jiān)聽(tīng)ref或reactive創(chuàng)建的對(duì)象類(lèi)型中的某個(gè)屬性,該類(lèi)型為對(duì)象數(shù)據(jù)類(lèi)型,可以直接寫(xiě),也可以寫(xiě)成函數(shù)形式,需要開(kāi)啟deep: true。如果想要監(jiān)聽(tīng)引用地址變化,必須寫(xiě)成函數(shù)形式
| 序號(hào) | 情況 | 是否使用函數(shù)寫(xiě)法 | 是否需要手動(dòng)開(kāi)啟深度監(jiān)聽(tīng) |
|---|---|---|---|
| 1 | 監(jiān)聽(tīng)ref創(chuàng)建的基本數(shù)據(jù)類(lèi)型 | 否。必須直接寫(xiě),不可以寫(xiě)成函數(shù)形式 | 否 |
| 2 | 監(jiān)聽(tīng)ref創(chuàng)建的對(duì)象數(shù)據(jù)類(lèi)型 | 皆可??梢灾苯訉?xiě),也可以寫(xiě)成函數(shù)形式 | 是 |
| 3 | 監(jiān)聽(tīng)reactive創(chuàng)建的對(duì)象數(shù)據(jù)類(lèi)型 | 否。必須直接寫(xiě),不可以寫(xiě)成函數(shù)形式 | 否。默認(rèn)開(kāi)啟了深度監(jiān)聽(tīng) |
| 4 | 監(jiān)聽(tīng)ref或reactive創(chuàng)建的對(duì)象類(lèi)型中的某個(gè)屬性,該類(lèi)型為基本數(shù)據(jù)類(lèi)型 | 是。必須寫(xiě)成函數(shù)形式 | 否 |
| 5 | 監(jiān)聽(tīng)ref或reactive創(chuàng)建的對(duì)象類(lèi)型中的某個(gè)屬性,該類(lèi)型為對(duì)象數(shù)據(jù)類(lèi)型 | 皆可??梢灾苯訉?xiě),也可以寫(xiě)成函數(shù)形式;如果想要監(jiān)聽(tīng)引用地址變化,必須寫(xiě)成函數(shù)形式 | 是 |
到此這篇關(guān)于詳解vue3中watch監(jiān)聽(tīng)的幾種情況的文章就介紹到這了,更多相關(guān)vue3 watch監(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中watch監(jiān)聽(tīng)的四種寫(xiě)法
- 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)使用詳解
相關(guān)文章
VUE中攔截請(qǐng)求并無(wú)感知刷新token方式
這篇文章主要介紹了VUE中攔截請(qǐng)求并無(wú)感知刷新token方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
vue項(xiàng)目使用.env文件配置全局環(huán)境變量的方法
這篇文章主要介紹了vue項(xiàng)目使用.env文件配置全局環(huán)境變量的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Vue與Node.js通過(guò)socket.io通信的示例代碼
這篇文章主要介紹了Vue與Node.js通過(guò)socket.io通信的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
解決vue-router 切換tab標(biāo)簽關(guān)閉時(shí)緩存問(wèn)題
這篇文章主要介紹了解決vue-router 切換tab標(biāo)簽關(guān)閉時(shí)緩存問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
Vue自定義指令實(shí)現(xiàn)checkbox全選功能的方法
下面小編就為大家分享一篇Vue自定義指令實(shí)現(xiàn)checkbox全選功能的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Element修改彈窗類(lèi)組件的層級(jí)的實(shí)現(xiàn)
本文主要介紹了Element修改彈窗類(lèi)組件的層級(jí)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
壓縮Vue.js打包后的體積方法總結(jié)(Vue.js打包后體積過(guò)大問(wèn)題)
大家都知道,Vuejs的 CLI工具 是基于 webpack 來(lái)實(shí)現(xiàn)的,所以在項(xiàng)目打包后,會(huì)生成的文件會(huì)很大。 主要原因是 webpack 將我們所有文件都打包成一個(gè)js文件,即使再小的項(xiàng)目,打包之后文件都會(huì)變得很大。 下面講講最近我遇到的相同問(wèn)題。2020-02-02
vue+echarts繪制省份地圖并添加自定義標(biāo)注方式
這篇文章主要介紹了vue+echarts繪制省份地圖并添加自定義標(biāo)注方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Vue中引入swiper報(bào)錯(cuò)的問(wèn)題及解決
這篇文章主要介紹了Vue中引入swiper報(bào)錯(cuò)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10

