老生常談Vue中的偵聽(tīng)器watch
一、偵聽(tīng)器watch

(思維導(dǎo)圖不太完善,因?yàn)槭前凑兆约嚎炊姆绞接浀?,如有錯(cuò)誤,還請(qǐng)指正)
1.1.初識(shí)偵聽(tīng)器watch
??
watch:觀看,監(jiān)視

那么什么是偵聽(tīng)器watch呢
- 開(kāi)發(fā)中我們?cè)?code>data返回的對(duì)象中定義了數(shù)據(jù),這個(gè)數(shù)據(jù)通過(guò)插值語(yǔ)法等方式綁定到
template中; - 當(dāng)數(shù)據(jù)變化時(shí),
template會(huì)自動(dòng)進(jìn)行更新來(lái)顯示最新的數(shù)據(jù); - 但是在某些情況下,我們希望在代碼邏輯中監(jiān)聽(tīng)某個(gè)數(shù)據(jù)的變化,這個(gè)時(shí)候就需要用偵聽(tīng)器
watch來(lái)完成了;
1.2.Vue的data的watch
??
案例:
- 我們希望用戶(hù)在input中輸入一個(gè)問(wèn)題;
- 每當(dāng)用戶(hù)輸入了最新的內(nèi)容,我們就獲取到最新的內(nèi)容,并且使用該問(wèn)題去服務(wù)器查詢(xún)答案;
- 那么,我們就需要實(shí)時(shí)的去獲取最新的數(shù)據(jù)變化;
- 此時(shí)就要用到偵聽(tīng)器watch去監(jiān)聽(tīng)數(shù)據(jù)是否發(fā)生變化
const app = Vue.createApp({
data() {
return {
message: "Hello Vue",
info: { name: "kk", age: 18 },
};
},
methods: {
changeMessage() {
this.message = "hello kk";
this.info = { name: "kk" };
},
},
watch: {
// 1.默認(rèn)有兩個(gè)參數(shù),newValue/oldValue
message(newValue, oldVale) {
console.log("message數(shù)據(jù)發(fā)生了變化", newValue, oldValue);
},
info(newValue, oldValue) {
// 2.如果是對(duì)象類(lèi)型,那么拿到的是代理對(duì)象
console.log("info數(shù)據(jù)發(fā)生了變化", newValue, oldValue);
console.log(newValue.name, oldValue.name);
// 3.獲取原始對(duì)象
console.log({ ...newValue });
1.3.Vue的watch偵聽(tīng)選項(xiàng)
??
- 創(chuàng)建一個(gè)對(duì)象,賦值給info
- 點(diǎn)擊按鈕的時(shí)候會(huì)修改info.name的值
- 此時(shí)使用watch并不能偵聽(tīng)info,因?yàn)槟J(rèn)情況下,watch只是在偵聽(tīng)info的引用變化,對(duì)于內(nèi)部屬性的變化是不會(huì)做出響應(yīng)的
- 所以我們可以使用deep深度監(jiān)聽(tīng)
- 希望一開(kāi)始的就會(huì)立即執(zhí)行一次:這個(gè)時(shí)候我們使用immediate選項(xiàng);無(wú)論數(shù)據(jù)是否變化,偵聽(tīng)的函數(shù)都會(huì)有限執(zhí)行一次的
<div id="app">
<h2>{{info.name}}</h2>
<button @click="changeInfo">修改info</button>
</div> const app = Vue.createApp({
data() {
return {
info: { name: "kk", age: 18 },
};
},
methods: {
changeInfo() {
// 創(chuàng)建一個(gè)對(duì)象,賦值給info
this.info = { name: "kk" };
// 直接修改對(duì)象里的一個(gè)屬性
this.info.name = "kk";
},
},
watch: {
// 默認(rèn)watch監(jiān)聽(tīng)不會(huì)進(jìn)行深度監(jiān)聽(tīng)
info(newValue, oldValue) {
console.log("偵聽(tīng)到info改變", newValue, oldValue);
},
// 進(jìn)行深度監(jiān)聽(tīng)
info: {
handler(newValue, oldValue) {
console.log("偵聽(tīng)到info改變", newValue, oldValue);
console.log(newValue === oldValue);
},
// 監(jiān)聽(tīng)器選項(xiàng)
// info進(jìn)行深度監(jiān)聽(tīng)
deep: true,
// 第一次渲染直接執(zhí)行一次監(jiān)聽(tīng)器
immediate: true,
},
},
"info.name": function (newValue, oldValue) {
console.log("name發(fā)生改變", newValue, oldValue);
},
});
app.mount("#app");
到此這篇關(guān)于Vue中的偵聽(tīng)器watch的文章就介紹到這了,更多相關(guān)Vue偵聽(tīng)器watch內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue3中watchEffect高級(jí)偵聽(tīng)器的具體使用
Vue3中新增了一種特殊的監(jiān)聽(tīng)器watchEffect,本文主要介紹了Vue3中watchEffect高級(jí)偵聽(tīng)器的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01
Vue3解析markdown并實(shí)現(xiàn)代碼高亮顯示的詳細(xì)步驟
Vue的markdown解析庫(kù)有很多,如markdown-it、vue-markdown-loader、marked、vue-markdown等,這篇文章主要介紹了Vue3解析markdown并實(shí)現(xiàn)代碼高亮顯示,需要的朋友可以參考下2022-07-07
Vue3中Vite和Vue-cli的特點(diǎn)與區(qū)別詳解
vue-cli是Vue早期推出的一款腳手架,使用webpack創(chuàng)建Vue項(xiàng)目,可以選擇安裝需要的各種插件,比如Vuex、VueRouter,下面這篇文章主要給大家介紹了關(guān)于Vue3中Vite和Vue-cli的特點(diǎn)與區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-12-12
VUE JS 使用組件實(shí)現(xiàn)雙向綁定的示例代碼
本篇文章主要介紹了VUE JS 使用組件實(shí)現(xiàn)雙向綁定,詳細(xì)的介紹了vue的雙向數(shù)據(jù)綁定原理以及核心代碼模塊,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
Vue實(shí)現(xiàn)的父組件向子組件傳值功能示例
這篇文章主要介紹了Vue實(shí)現(xiàn)的父組件向子組件傳值功能,結(jié)合完整實(shí)例形式簡(jiǎn)單分析了vue.js組件傳值的相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
基于Vue的SPA動(dòng)態(tài)修改頁(yè)面title的方法(推薦)
這篇文章主要介紹了基于Vue的SPA動(dòng)態(tài)修改頁(yè)面title的方法,需要的朋友可以參考下2018-01-01

