computed和watch區別
computed:通過屬性計算而得來的屬性
1、computed內部的函式在呼叫時不加()。
2、computed是依賴data的屬性變化而變化的,當data中的屬性發生改變的時候,當前函式才會執行,data中的屬性沒有改變的時候,當前函式不會執行。
3、computed中的函式必須用return返回。
4、在computed中不要對data中的屬性進行賦值操作。如果對data中的屬性進行賦值操作了,就是data中的屬性發生改變,從而觸發computed中的函式,形成死迴圈了。
5、當computed中的函式所依賴的屬性沒有發生改變,那麼呼叫當前函式的時候會從快取中讀取。
watch:屬性監聽
1、watch中的函式名稱必須要和data中的屬性名一致,因為watch是依賴data中的屬性,當data中的屬性發生改變的時候,watch中的函式就會執行。
2、watch中的函式有兩個引數,前者是newVal,後者是oldVal。
3、watch中的函式是不需要呼叫的。
4、watch只會監聽資料的值是否發生改變,而不會去監聽資料的地址是否發生改變。也就是說,watch想要監聽引用型別資料的變化,需要進行深度監聽。“obj.name”(){}------如果obj的屬性太多,這種方法的效率很低,obj:{handler(newVal){},deep:true}------用handler+deep的方式進行深度監聽。
5、特殊情況下,watch無法監聽到陣列的變化,特殊情況就是說更改陣列中的資料時,陣列已經更改,但是檢視沒有更新。更改陣列必須要用splice()或者set.this.arr.splice (0,1,100 ) − − − − − 修 改 a r r 中 第 0 項 開 始 的 1 個 數 據 為 100 , this.set.this.arr.splice(0,1,100)-----修改arr中第0項開始的1個數據為100,this.set.this.arr.splice(0,1,100)−−−−−修改arr中第0項開始的1個數據為100,this.set(this.arr,0,100)-----修改arr第0項值為100。
6、immediate:true 頁面首次載入的時候做一次監聽。