watch是vue中提供的一個方法,用來觀察數據變更,進行數據監聽的一種方式。也能夠這樣說 watch是一個對象,能夠看做對象使用,是對象就有鍵,有值。vue
鍵:是須要監聽的目標,能夠是data中的某個變量。java
值能夠是函數:就是當你監聽的變量發生變化時,須要執行的函數,這個函數有兩個形參,第一個是當前值,第二個是更新後的值。數組
值能夠是函數名:不過這個函數名要使用單引號來標註。app
值能夠是選項中的對象:選項包括有三個。函數
<div class="app">
<div> <p>watch方法使用</p> <input v-model="data"/> </div> </div>
<script>
var vm = new Vue({
el: '.app',
data: {
data: '111',
obj: {
arr: [
{value: ''}
],
data: ''
}
},
watch: {
data(newVal, oldVal) {
console.log(newVal, oldVal)
}
},
});
</script>
複製代碼
結果如圖所示:ui
<script>
var vm = new Vue({
el: '.app',
data: {
data: '111',
obj: {
arr: [
{value: ''}
],
data: ''
}
},
watch: {
data(newVal, oldVal) {
console.log(newVal, oldVal)
},
'obj': {
deep: true,
handler (newVal, oldVal) {
console.log(newVal)
}
}
},
methods: {
addInput () {
this.obj.arr.push({value: '111'})
}
}
});
複製代碼
結果以下: this
當對象中的某一項數據發生變化時,都會被監聽到。若是想監聽對象中的某一項,能夠用對象名.屬性名,如"obj.data",雙引號必須加上。在最近的項目中,我遇到了這樣一個問題,在用watch監聽對象的時候,對象裏面數組的變更沒法實時渲染到頁面中,也由於這個問題卡了好久~~~最後,經過set方法解決了這樣的問題,下面我來總結一下本身對set方法的理解。spa
因爲javaScript的限制,vue不能檢測如下變更的數組3d
爲了解決以上的問題,set方法就能發揮它的做用了~code
vue.set(target,key,value)
參數設置:
返回值:
用法:
設置對象的屬性,同時觸發視圖更新。這個方法主要是用於爲了避開vue不能檢測屬性被添加的限制。
<div class="app">
<div>
<p>set方法使用</p>
<ul>
<li v-for="(item, index) in arr">{{item}}</li>
</ul>
</div>
</div>
<script>
var vm = new Vue({
el: '.app',
data: {
arr: ['aaa', 'bbb', 'ccc']
}
});
vm.arr[1] = 'ddd'
console.log(vm.arr) // ['aaa','ddd','ccc']
複製代碼
運行結果:
(界面顯示)
(控制檯顯示) 由上面的結果的能夠看出,數組的第一項的值被改變了,在控制下面的數據已是更新的了,但在界面中顯示的依舊是原來數組裏面的值,因而可知,變更的數據並無實時更新到視圖中。出現這種狀況,那咱們就可使用set方法來解決啦~<script>
var vm = new Vue({
el: '.app',
data: {
arr: ['aaa', 'bbb', 'ccc']
}
});
Vue.set(vm.arr, 1, 'ddd')
console.log(vm.arr) // ['aaa','ddd','ccc']
複製代碼
運行結果:
(界面顯示)
(控制檯顯示) 由以上結果能夠看出,利用set方法則更新數組的同時也觸發了視圖的更新。