vue強制刷新組件更新數據的方式


問題:彈出框添加內容后隱藏,然后再次點擊打開的時候內容還在,此時需要刷新組件來操作。或者有些時候我們需要強制觸發組件的刷新,又或者數據明明改變了,但是確沒有刷新視圖。

一:$forceupdate()  (僅針對當前組件以及其插槽相關子組件)

例如:當data中的某個內容進行了改變,但是頁面沒有進行實時的刷新,而我又通過打印能確定數據確實改變了,因此可以使用$ forceupdate()來迫使當前組件刷新

// 代碼執行完畢數據確實改變了,但是頁面沒刷新的情況,需要下面的內容
this.$forceupdate();

this.$forceupdate() 迫使vue組件重新渲染,實際上指的是強制重啟render函數。即調用該方法后 只會觸發beforeUpdate、updated 這兩個生命周期,而且只會影響當前組件以及其插槽內容

最常見的問題:就是在v-for循環或者某個操作中對data中的內容進行增加、修改、或者刪除操作,data中的數據確實改變了,而且打印的內容也改變了,但是頁面卻沒有刷新達到理想效果,這里則可以使用this.$ forceupdate()。
問題誕生的本質是vue雖然是響應式的.但受到javascript的限制,Vue不能檢測到對象屬性的添加或刪除,因為vue在初始化實列時將屬性轉為getter/setter,所以屬性必須在data對象上才能讓vue轉換它
調用$ forceupdate()就能夠讓頁面重啟render函數,即將數據的改變重新進行渲染,就感覺手動刷新頁面一樣,但是只會觸發兩個生命周期beforeUpdate和updated
該問題的另一種解決方式可以使用Vue.$set()

二:

     v-if通過變量控制的形式,可以觸發 被控制的組件 beforeCreate、created、beforeMount、mounted、beforeDestroy、destroyed 這6個生命周期,但是由於v-if指令的原因,會導致其控制的內容會發生顯示與隱藏操作

使用v-if加上變量的形式來控制組件的加載與銷毀,好處在於能夠直接觸發組件的完整生命周期
使用v-if的好處在於可以在父組件中通過某個變量來控制子組件的渲染,打開的時候子組件會觸發beforeCreate、created、beforeMount、mounted四個生命周期,關閉的時候子組件會觸發beforeDestroy、destroyed兩個生命周期,因此在某些操作中如果需要通過某個變量的內容來對子組件進行生命周期的刷新,即可用v-if來進行顯隱操作

三:通過key屬性來進行刷新操作,在web中的效果是最理想的,因為頁面根本感覺不到組件的銷毀與創建過程,但是確實滿足了組件的刷新功能。
操作方式:在data中定義某個變量,然后將該變量放置在組件的key屬性中,要實現該組件刷新時,只需改變變量的值即可

<template>
    <child ref="child1" :key='value'></child>
</template>
<script>
import child from "./child";
export default {
 components: { child },
 data() {
    return {
      value: '0'// 只需要通過操作如改變這個值,child子組件就會刷新,而且視覺上不會有變化,當key值改變的時候,child子組件實際上經歷了新的child的創建過程以及舊的child的銷毀過程
    };
  },
 }
</script>

 

        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM