首頁 > 軟體

Vue computed與watch用法區分

2023-02-03 18:00:44

computed用法

  • 響應式快取
  • 每一個計算屬性都會被快取起來,只要計算屬性所依賴的屬性發生變化,計算屬性就會重新執行,檢視也會更新
  • computed方法裡面的屬性不能在Date中定義
  • .具有快取性,頁面重新渲染值不變化,,計算屬性會立即返回之前的計算結果,而不必再次執行函數
data: {
    firstName: 'one',
    lastName: 'two'
  },
//計算方法
computed: {
allname:{
	//回撥函數 當需要讀取當前屬性值是執行,根據相關資料計算並返回當前屬性的值
	get() {//
		return this.firstName + ' ' + this.lastName
	},
	//監視當前屬性值的變化,當屬性值發生變化時執行,更新相關的屬性資料
	set(val){
		const names = val.split(' ');
		this.firstName = names[0];
        this.lastName = names[1];
	}
}
},

watch用法

  • 需要在資料變化時執行非同步或開銷較大的操作時,這個方式是最有用的
  • 應用:監聽props,$emit或本元件的值執行非同步操作
  • 無快取性,頁面重新渲染時值不變化也會執行

watch: {
    被監聽的資料: {
        handler(新值, 舊值) {
            相關程式碼邏輯...
        }
    }
}

  • 被監聽的資料:data中定義的資料
  • 新值:該資料改變後的新值;
  • 舊值:該資料改變之前的值。

常見應用

  • 監聽本元件計算和監聽
  • 計算或監聽父傳子的props值
  • 分為簡單資料型別和複雜資料型別監聽,監聽方法如上watch的使用
  • 監聽vuex的state或者getters值的變化
computed:{
    stateDemo(){
        return this.$store.state.demoState;
    }
}
watch:{
    stateDemo(){
        console.log('vuex變化啦')
    }
}

常見錯誤

當修改父元件傳過來的值,會報錯

props:['listShop'],
    data(){
      return{}
    },
    created(){
      this.listShop=30
}

報錯,錯誤是說的避免直接修改父元件傳入的值,因為會改變父元件的值

解決方法1,如果傳的是簡單型別,就在data中重新定義一個變數,改變指向,複雜型別不行,複雜型別存的是指標

//不會有任何報錯,也不會影響父元件!
	props:['listShop'],
    data(){
      return{
        listShopChild:this.listShop //改變指向
      }
    },
    created(){
      this.listShopChild=30
    }

但如果是複雜型別,因為存的是指標,賦值給新變數也會改變原始變數值

方法:

1.手動深度克隆

2.Object.assign,只會對只是一級屬性複製,比淺拷貝多深拷貝了一層而已,所以還是無法達到深度克隆的目的.

3.強大的JSON.stringify和JSON.parse

4.直接用computed改變

//陣列深度克隆:
var x = [1,2,3];
var y = [];
for (var i = 0; i < x.length; i++) {
    y[i]=x[i];
}
console.log(y);  //[1,2,3]
y.push(4);
console.log(y);  //[1,2,3,4]
console.log(x);  //[1,2,3]
//物件深度克隆:
var x = {a:1,b:2};
var y = {};
for(var i in x){
    y[i] = x[i];
}
console.log(y);  //Object {a: 1, b: 2}
y.c = 3;
console.log(y);  //Object {a: 1, b: 2, c: 3}
console.log(x);  //Object {a: 1, b: 2}
//函數深度克隆
//為什麼函數可以直接賦值克隆?
//由於函數物件克隆之後的物件會單獨複製一次並儲存實際資料,因此並不會影響克隆之前的物件。所以採用簡單的複製「=」即可完成克隆。
var x = function(){console.log(1);};
var y = x;
y = function(){console.log(2);};
x();  //1
y();  //2
//方法三
const obj1 = JSON.parse(JSON.stringify(obj));
//方法四
computed:{
  listShopChild(){
    return this.listShop
   }
}

到此這篇關於Vue computed與watch用法區分的文章就介紹到這了,更多相關Vue computed與watch內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com