Vue基礎(chǔ)之偵聽(tīng)器詳解
vue中什么是偵聽(tīng)器
- 開(kāi)發(fā)中我們?cè)赿ata返回的對(duì)象中定義了數(shù)據(jù),這個(gè)數(shù)據(jù)可以通過(guò)插值語(yǔ)法等方式綁定到templat中。
- 當(dāng)數(shù)據(jù)變化的時(shí)候,template里綁定的數(shù)據(jù)會(huì)自動(dòng)進(jìn)行更新來(lái)顯示最新的數(shù)據(jù)。但是這種變化是在template中自動(dòng)偵聽(tīng)data的值來(lái)進(jìn)行變換的
- 在某些情況下,我們希望在代碼邏輯中監(jiān)聽(tīng)某個(gè)數(shù)據(jù)的變化,這個(gè)時(shí)候就需要用到偵聽(tīng)器watch了
官方定義:Vue 通過(guò) watch 選項(xiàng)提供了一個(gè)更通用的方法,來(lái)響應(yīng)數(shù)據(jù)的變化。當(dāng)需要在數(shù)據(jù)變化時(shí)執(zhí)行異步或開(kāi)銷較大的操作時(shí),這個(gè)方式是最有用的。
一個(gè)對(duì)象,鍵是要偵聽(tīng)的響應(yīng)式 property——包含了 data 或 computed property,而值是對(duì)應(yīng)的回調(diào)函數(shù)。值也可以是方法名,或者包含額外選項(xiàng)的對(duì)象。組件實(shí)例將會(huì)在實(shí)例化時(shí)調(diào)用 $watch(),參閱 $watch,以了解更多關(guān)于 deep、immediate 和 flush 選項(xiàng)的信息
偵聽(tīng)器的用法
選項(xiàng):watch
類型:{ [key: string]: string | Function | Object | Array}
偵聽(tīng)器watch的配置選項(xiàng):
默認(rèn)情況下,watch只是在偵聽(tīng)數(shù)據(jù)的引用變化,對(duì)于數(shù)據(jù)內(nèi)部屬性的變化是不會(huì)做出響應(yīng)的:
這個(gè)時(shí)候我們可以使用一個(gè)選項(xiàng)deep進(jìn)行更深層的偵聽(tīng);另外一個(gè)屬性,是希望一開(kāi)始的就會(huì)立即執(zhí)行一次:這個(gè)時(shí)候我們使用immediate選項(xiàng);這個(gè)時(shí)候無(wú)論后面數(shù)據(jù)是否有變化,偵聽(tīng)的函數(shù)都會(huì)有限執(zhí)行一次;
data的內(nèi)容:
data() {
return {
info: {
name: 'cgj'
}
}
}
watch: {
info: {
handler(newValue, oldValue) {
console.log(newValue, oldValue)
}
deep: true,
immediate: true,
}
}
另外一個(gè)是Vue3文檔中沒(méi)有提到的,但是Vue2文檔中有提到的是偵聽(tīng)對(duì)象的屬性:
'info.name': function(newValue, oldValue) {
console.log(newValue, oldValue)
}
還有另外一種方式就是使用 $watch 的API:
具體$watch可以查看官方的API查看(用的方式比較少):實(shí)例方法 | Vue.js
const app = createApp({
data() {
return {
a: 1,
b: 2,
c: {
d: 4
},
e: 5,
f: 6
}
},
watch: {
// 偵聽(tīng)頂級(jí) property
a(val, oldVal) {
console.log(`new: ${val}, old: ${oldVal}`)
},
// 字符串方法名
b: 'someMethod',
// 該回調(diào)會(huì)在任何被偵聽(tīng)的對(duì)象的 property 改變時(shí)被調(diào)用,不論其被嵌套多深
c: {
handler(val, oldVal) {
console.log('c changed')
},
deep: true
},
// 偵聽(tīng)單個(gè)嵌套 property
'c.d': function (val, oldVal) {
// do something
},
// 該回調(diào)將會(huì)在偵聽(tīng)開(kāi)始之后被立即調(diào)用
e: {
handler(val, oldVal) {
console.log('e changed')
},
immediate: true
},
// 你可以傳入回調(diào)數(shù)組,它們會(huì)被逐一調(diào)用
f: [
'handle1',
function handle2(val, oldVal) {
console.log('handle2 triggered')
},
{
handler: function handle3(val, oldVal) {
console.log('handle3 triggered')
}
/* ... */
}
]
},
methods: {
someMethod() {
console.log('b changed')
},
handle1() {
console.log('handle 1 triggered')
}
}
})
const vm = app.mount('#app')
vm.a = 3 // => new: 3, old: 1
vue偵聽(tīng)器-watch
目標(biāo): 可以偵聽(tīng)data/computed屬性值改變
語(yǔ)法:
watch: {
"被偵聽(tīng)的屬性名" (newVal, oldVal){
}
}
例子代碼:
<template>
<div>
<input type="text" v-model="name">
</div>
</template>
<script>
export default {
data(){
return {
name: ""
}
},
// 目標(biāo): 偵聽(tīng)到name值的改變
/*
語(yǔ)法:
watch: {
變量名 (newVal, oldVal){
// 變量名對(duì)應(yīng)值改變這里自動(dòng)觸發(fā)
}
}
*/
watch: {
// newVal: 當(dāng)前最新值
// oldVal: 上一刻值
name(newVal, oldVal){
console.log(newVal, oldVal);
}
}
}
</script>
<style>
</style>
小結(jié): 想要偵聽(tīng)一個(gè)屬性變化, 可使用偵聽(tīng)屬性watch
vue偵聽(tīng)器-深度偵聽(tīng)和立即執(zhí)行
目標(biāo): 可以偵聽(tīng)data/computed屬性值改變
語(yǔ)法:
watch: {
"被偵聽(tīng)的屬性名" (newVal, oldVal){
}
}
例子代碼:
<template>
<div>
<input type="text" v-model="user.name">
<input type="text" v-model="user.age">
</div>
</template>
<script>
export default {
data(){
return {
user: {
name: "",
age: 0
}
}
},
// 目標(biāo): 偵聽(tīng)對(duì)象
/*
語(yǔ)法:
watch: {
變量名 (newVal, oldVal){
// 變量名對(duì)應(yīng)值改變這里自動(dòng)觸發(fā)
},
變量名: {
handler(newVal, oldVal){
},
deep: true, // 深度偵聽(tīng)(對(duì)象里面層的值改變)
immediate: true // 立即偵聽(tīng)(網(wǎng)頁(yè)打開(kāi)handler執(zhí)行一次)
}
}
*/
watch: {
user: {
handler(newVal, oldVal){
// user里的對(duì)象
console.log(newVal, oldVal);
},
deep: true,
immediate: true
}
}
}
</script>
<style>
</style>
小結(jié): immediate立即偵聽(tīng), deep深度偵聽(tīng), handler固定方法觸發(fā)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- vue基礎(chǔ)之面包屑和標(biāo)簽tag詳解
- vue基礎(chǔ)之ElementUI表格詳解
- Vue基礎(chǔ)之MVVM,模板語(yǔ)法和數(shù)據(jù)綁定
- vue基礎(chǔ)之使用get、post、jsonp實(shí)現(xiàn)交互功能示例
- vue基礎(chǔ)之事件v-onclick="函數(shù)"用法示例
- vue基礎(chǔ)之data存儲(chǔ)數(shù)據(jù)及v-for循環(huán)用法示例
- 從vue基礎(chǔ)開(kāi)始創(chuàng)建一個(gè)簡(jiǎn)單的增刪改查的實(shí)例代碼(推薦)
- vue快速入門基礎(chǔ)知識(shí)教程
相關(guān)文章
Vue3項(xiàng)目中引用TS語(yǔ)法的實(shí)例講解
這篇文章主要介紹了Vue3項(xiàng)目中引用TS語(yǔ)法的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
vue-cli3 打包優(yōu)化之 splitchunks詳解
這篇文章主要介紹了vue-cli3 打包優(yōu)化之 splitchunks的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
vue3?身份證校驗(yàn)、識(shí)別性別/生日/年齡的操作代碼
這篇文章主要介紹了vue3?身份證校驗(yàn)、識(shí)別性別/生日/年齡的操作代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),表單項(xiàng)綁定 @change 事件,?定義身份驗(yàn)證規(guī)則規(guī)則,感興趣的朋友跟隨小編一起看看吧2024-07-07
VUE響應(yīng)式原理的實(shí)現(xiàn)詳解
這篇文章主要為大家詳細(xì)介紹了VUE響應(yīng)式原理的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
vue中如何動(dòng)態(tài)獲取剩余區(qū)域的滾動(dòng)高度
這篇文章主要介紹了vue中如何動(dòng)態(tài)獲取剩余區(qū)域的滾動(dòng)高度問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Vue商品控件與購(gòu)物車聯(lián)動(dòng)效果的實(shí)例代碼
這篇文章主要介紹了Vue商品控件與購(gòu)物車聯(lián)動(dòng)效果的實(shí)例代碼,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
vue結(jié)合el-dialog封裝自己的confirm二次確認(rèn)彈窗方式
這篇文章主要介紹了vue結(jié)合el-dialog封裝自己的confirm二次確認(rèn)彈窗方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
vue3.0中使用websocket,封裝到公共方法的實(shí)現(xiàn)
這篇文章主要介紹了vue3.0中使用websocket,封裝到公共方法的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
Vue.js 點(diǎn)擊按鈕顯示/隱藏內(nèi)容的實(shí)例代碼
下面小編就為大家分享一篇Vue.js 點(diǎn)擊按鈕顯示/隱藏內(nèi)容的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02

