在Vue中,computed是一種計算屬性,可以用于處理數據并將它們顯示在模板中。 computed是有緩存的,當其依賴的數據沒有發生變化時,會直接讀取緩存中的數據,不會重新計算。但是有時候我們需要讓computed重新觸發計算,本文將會介紹一些方法。
最常見的讓computed重新計算的方法是在watcher中手動觸發計算,可以使用$watch或watch屬性。當在watcher中監聽了computed所依賴的數據,當數據發生變化時,手動將computed的值設置為undefined,在nextTick時computed會重新計算。下面是一個簡單的例子:
watch: { message: { handler() { this.computedValue = undefined; this.$nextTick(() =>{ console.log(this.computedValue); }); }, immediate: true, }, }, computed: { computedValue() { console.log('computed'); return this.message.toUpperCase(); }, },
當message發生變化時,會手動將computedValue設置為undefined,然后在nextTick的回調函數中讀取computedValue,此時computed會重新計算。
另一種方法是使用vm.$forceUpdate方法,這個方法可以強制組件重新渲染,會重新計算所有的computed。注意,這個方法會導致組件所有的子組件也會重新渲染,因此可能會帶來一些性能問題。下面是一個例子:
methods: { update() { this.$forceUpdate(); this.$nextTick(() =>{ console.log(this.computedValue); }); }, }, computed: { computedValue() { console.log('computed'); return this.message.toUpperCase(); }, },
當調用update方法時,會強制重新渲染組件,此時computed會重新計算。
還有一種方法是使用一個不變的key,這個方法比較簡單,只需要在template中使用一個不變的key,當key變化時,組件會重新渲染,computed也會重新計算。下面是一個例子:
{{ computedValue }}methods: { update() { this.key++; }, }, computed: { computedValue() { console.log('computed'); return this.message.toUpperCase(); }, }, data() { return { key: 0, }; },
當調用update方法時,會將key加1,此時組件會使用新的key重新渲染,computed也會重新計算。
總的來說,computed是有緩存的,當其依賴的數據沒有發生變化時,會直接讀取緩存中的數據,不會重新計算。但是有時候我們需要讓computed重新計算,可以使用watcher、vm.$forceUpdate方法或使用一個不變的key來實現。