Vue3中watch監(jiān)聽使用詳解
Vue2使用watch
<template> <div>總合:{{ sum }}<button @click="sum++">點擊累加</button></div> </template> <script> import { ref } from "vue"; export default { // vue2中使用watch watch: { sum: { deep: true, handler(newValue, oldValue) { console.log("總合 sum 變化:", newValue, oldValue); }, }, }, setup() { let sum = ref(0); return { sum, }; }, }; </script> <style> </style>
Vue3使用watch
watch有三個參數(shù):
參數(shù)1:監(jiān)聽的參數(shù)
參數(shù)2:監(jiān)聽的回調(diào)函數(shù)
參數(shù)3:監(jiān)聽的配置(immediate)
情況1
監(jiān)視ref所定義的一個響應(yīng)式數(shù)據(jù)
<template> <div>總合:{{ sum }}<button @click="sum++">點擊累加</button></div> </template>
// 監(jiān)視ref所定義的一個響應(yīng)式數(shù)據(jù) <script> import { ref, watch } from "vue"; export default { setup() { let sum = ref(0); // 監(jiān)視ref所定義的一個響應(yīng)式數(shù)據(jù) watch(sum, (newValue, oldValue) => { console.log("sum ==> ", newValue, oldValue); }); return { sum, }; }, }; </script>
情況2
監(jiān)視ref所定義的多個響應(yīng)式數(shù)據(jù)
<template> <div>總合:{{ sum }}<button @click="sum++">點擊累加</button></div> <hr /> <div> msg:{{ msg }} <button @click="msg += '~'">改變msg</button> </div> </template>
<script> import { ref, watch } from "vue"; export default { setup() { let sum = ref(0); let msg = ref("watch使用"): // 情況2:監(jiān)視ref所定義的多個響應(yīng)式數(shù)據(jù) watch([sum, msg], (newValue, oldValue) => { console.log("sum/msg ==> ", newValue, oldValue); },{immediate:true}); return { sum, msg, }; }, }; </script>
情況3
監(jiān)視reactive所定義的一個響應(yīng)式數(shù)據(jù)
注意:
- 這里無法正確獲取oldValue
- 強制開啟了深度監(jiān)聽(deep配置不生效)
<template> <div> <h3>情況3::監(jiān)視reactive所定義的一個響應(yīng)式數(shù)據(jù)</h3> <div>姓名:{{person.name}}</div> <div>年齡:{{person.age}}</div> <button @click="person.name += '~'">修改姓名</button> <button @click="person.age ++">修改年齡</button> </div> </template>
<script> import { ref, watch,reactive } from "vue"; export default { setup() { let person = reactive({ name: "lisa", age: 18, job: { joblist: { money: 10, }, }, }); // 情況3、監(jiān)視reactive所定義的一個響應(yīng)式數(shù)據(jù) /* 若watch監(jiān)視的是reactive定義的響應(yīng)式數(shù)據(jù),則無法正確獲得oldvalue! 若watch監(jiān)視的是reactive定義的響應(yīng)式數(shù)據(jù),則強制開啟了深度監(jiān)視 */ watch(person,(newValue, oldValue) => { console.log("person ==> ", newValue, oldValue); },{immediate:true,deep:false}//這里的deep配置不再奏效 ); return { person, }; }, }; </script>
情況4
監(jiān)視reactive所定義的一個響應(yīng)式數(shù)據(jù)中的某個屬性
<template> <div> <h3>情況4::監(jiān)視reactive所定義的一個響應(yīng)式數(shù)據(jù)中的某個屬性</h3> <div>姓名:{{person.name}}</div> <div>年齡:{{person.age}}</div> <button @click="person.name += '~'">修改姓名</button> <button @click="person.age ++">修改年齡</button> </div> </template>
<script> import { ref, watch,reactive } from "vue"; export default { setup() { let person = reactive({ name: "lisa", age: 18, job: { joblist: { money: 10, }, }, }); // 情況4、監(jiān)視reactive所定義的一個響應(yīng)式數(shù)據(jù)中的某個屬性 watch(()=>person.name,(newValue, oldValue) => { console.log("person.name ==> ", newValue, oldValue); }); return { person, }; }, }; </script>
情況5
監(jiān)視reactive所定義的一個響應(yīng)式數(shù)據(jù)中的某些屬性
<template> <div> <h3>情況4::監(jiān)視reactive所定義的一個響應(yīng)式數(shù)據(jù)中的某個屬性</h3> <div>姓名:{{person.name}}</div> <div>年齡:{{person.age}}</div> <button @click="person.name += '~'">修改姓名</button> <button @click="person.age ++">修改年齡</button> </div> </template>
<script> import { ref, watch,reactive } from "vue"; export default { setup() { let person = reactive({ name: "lisa", age: 18, job: { joblist: { money: 10, }, }, }); // 情況5、監(jiān)視reactive所定義的一個響應(yīng)式數(shù)據(jù)中的某些屬性 watch([()=>person.name,()=>person.age],(newValue, oldValue) => { console.log("person.name/person.age ==> ", newValue, oldValue); }); return { person, }; }, }; </script>
特殊情況
watch監(jiān)聽reactive中對象的嵌套對象
<template> <div> <div>姓名:{{person.name}}</div> <div>年齡:{{person.age}}</div> <div>薪資:{{person.job.joblist.money}} K</div> <button @click="person.name += '~'">修改姓名</button> <button @click="person.age ++">修改年齡</button> <button @click="person.job.joblist.money ++">提薪</button> </div> </template>
<script> import { ref, watch,reactive } from "vue"; export default { setup() { let person = reactive({ name: "lisa", age: 18, job: { joblist: { money: 10, }, }, }); // 特殊情況、監(jiān)視reactive所定義嵌套對象 watch(()=>person.job,(newValue, oldValue) => { console.log("person.job對象發(fā)生變化 ==> ", newValue, oldValue); },{deep:true});//此處由于監(jiān)視的是reactive素定義的對象中的某個屬性,所以deep配置有效 return { person, }; }, }; </script>
總結(jié)
到此這篇關(guān)于Vue3中watch監(jiān)聽使用詳解的文章就介紹到這了,更多相關(guān)Vue3中watch使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項目實現(xiàn)減少app.js和vender.js的體積操作
這篇文章主要介紹了vue項目實現(xiàn)減少app.js和vender.js的體積操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11antd-DatePicker組件獲取時間值,及相關(guān)設(shè)置方式
這篇文章主要介紹了antd-DatePicker組件獲取時間值,及相關(guān)設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10vue中使用v-if,v-else來設(shè)置css樣式的步驟
我們在使用vue項目開發(fā)時,v-if是使用的非常多的,在這里我們談?wù)勅绾问褂胿-i來綁定修改css樣式,使用的主要是雙向數(shù)據(jù)綁定,即通過改變他的狀態(tài)來改變他的樣式,這篇文章主要介紹了vue中如何使用v-if,v-else來設(shè)置css樣式,需要的朋友可以參考下2023-03-03在uniapp中實現(xiàn)圖形驗證碼的詳細(xì)步驟
圖形驗證碼是一種常見的安全措施,用于防止自動化軟件(機器人)濫用網(wǎng)站資源,如自動提交表單,這篇文章主要介紹了在uniapp中實現(xiàn)圖形驗證碼的詳細(xì)步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11