watch
監聽器主要是用來監聽變量的變化,而後經過對變量的監聽,在鉤子函數中寫入相應的操做。
1.對於普通變量的監聽
- 比方說要對data中的
count
變量進行監聽,其中有兩個回調參數,一個是新的值,一個是舊的值,即改變後和改變以前的值
export default {
name: "Test",
data(){
return{
count:0,
}
},
watch:{
count(newValue,oldValue){
}
},
}
複製代碼
2.對於對象的監聽
- 若是咱們監聽的是一個對象,會發現執行
this.queryList.name='jack'
,是沒法觸發watch監聽的
export default {
name: "Test",
data(){
return{
queryList:{
count:0,
name:'',
}
}
},
watch:{
queryList(newValue,oldValue){
}
},
}
複製代碼
- 這時候就須要用到
deep
屬性進行深度監聽,監聽器會一層層的往下遍歷,給對象的全部屬性都加上這個監聽器,可是這樣性能開銷就會很是大了,任何修改queryList
裏面任何一個屬性都會觸發這個監聽器裏的handler
。
export default {
name: "Test",
data(){
return{
queryList:{
count:0,
name:'',
}
}
},
watch:{
queryList:{
handle(newValue,oldValue){
},
deep:true,
}
},
}
複製代碼
- 可是有的時候,比方說我只想監聽
queryList.name
的變化,對於queryList.count
不須要監聽,那麼咱們能夠採用下面的這種寫法,能作到只對這個對象裏的特定屬性進行屬性監聽的同時,相比於監聽整個對象而言有更多的性能提高
export default {
name: "Test",
data(){
return{
queryList:{
count:0,
name:''
}
}
},
watch:{
'queryList.name':{
handle(newValue,oldValue){
},
}
},
}
複製代碼
3.在首次綁定的時候當即觸發監聽
- 比方說是文章的詳情頁面,根據文章的id渲染相應的文章詳情,經過對路由信息
$route.query.id
進行監聽,而後調用相應的接口獲取數據,固然能夠在created
或者mounted
生命週期中寫入事件,但若是隻經過watch實現,咱們一樣也能夠作到,那就是使用watch的immediate
屬性,設置爲true,無論這個值是否發生過改變,就會在初始化之後當即先去執行裏面的handler
方法
watch:{
'$route.query.id':{
handle(newValue,oldValue){
},
immediate:true
}
},
複製代碼