在vue的項目中,咱們時常會須要對data的改變作出處理,這時候就須要用到watch和computed這兩個屬性,既然都是數值改變觸發改變的屬性,他們之間又有什麼異同呢?vue
var vm = new Vue({ el: '#app', data: { message: 'red' }, template: ` <div> <p>我是原始值: "{{ message }}"</p> <p>我是計算屬性的值: "{{ computedMessage}}"</p> // computed 在 DOM 裏直接使用不須要調用 </div> `, computed: { // 計算屬性的 getter computedMessage: function () { // `this` 指向 vm 實例 return this.message.split('').reverse().join('') } } })
結果:
我是原始值: "red"
我是計算屬性的值: "der"緩存
若是不使用計算屬性,那麼 message.split('').reverse().join('') 就會直接寫到 template 裏,那麼在模版中放入太多聲明式的邏輯會讓模板自己太重,尤爲當在頁面中使用大量複雜的邏輯表達式處理數據時,會對頁面的可維護性形成很大的影響app
並且計算屬性若是依賴不變的話,它就會變成緩存,computed 的值就不會從新計算異步
因此,若是數據要經過複雜邏輯來得出結果,那麼就推薦使用計算屬性函數
Vue 實例將會在實例化時調用$watch()
,遍歷 watch 對象的每個屬性this
new Vue({ data: { n: 0, obj: { a: "a" } }, template: ` <div> <button @click="n += 1">n+1</button> <button @click="obj.a += 'hi'">obj.a + 'hi'</button> <button @click="obj = {a:'a'}">obj = 新對象</button> </div> `, watch: { n() { console.log("n 變了"); }, obj:{ handler: function (val, oldVal) { console.log("obj 變了") }, deep: true // 該屬性設定在任何被偵聽的對象的 property 改變時都要執行 handler 的回調,不論其被嵌套多深 }, "obj.a":{ handler: function (val, oldVal) { console.log("obj.a 變了") }, immediate: true // 該屬性設定該回調將會在偵聽開始以後被當即調用 } } }).$mount("#app");
注意:不該該使用箭頭函數來定義 watcher 函數,由於箭頭函數沒有 this,它的 this 會繼承它的父級函數,可是它的父級函數是 window,致使箭頭函數的 this 指向 window,而不是 Vue 實例code
vm.$watch("n", function(val, newVal){ console.log("n 變了"); },{deep: true, immediate: true})
相同點:對象
二者都是觀察頁面數據變化的。繼承
不一樣點:get