Vue中重新渲染組件的方法總結(jié)

有時(shí)Vue的反應(yīng)性系統(tǒng)還不夠,您只需要重新渲染組件即可夺蛇。
重新渲染組件有以下幾個(gè)辦法:

1.可怕的方法:重新加載整個(gè)頁面
2.可怕的方法:使用v-if
3.更好的方法:使用Vue的內(nèi)置forceUpdate方法
4.最好的方法:在組件上進(jìn)行key更改

重新加載整個(gè)頁面

非常不建議這樣做,我們來看下一個(gè)辦法。

使用v-if

v-if指令鲤孵,該指令僅在組件為true時(shí)才渲染瘩欺。 如果為false蜘腌,則該組件在DOM中不存在沫屡。
下面我們?cè)O(shè)置它以使其v-if能夠正常工作的方式饵隙。

在您的template撮珠,您將添加v-if指令:

<template>
  <my-component v-if="renderComponent" />
</template>

script您將添加使用以下方法nextTick:

<script>
  export default {
    data() {
      return {
        renderComponent: true,
      };
    },
    methods: {
      forceRerender() {
        // 從 DOM 中刪除 my-component 組件
        this.renderComponent = false;
        
        this.$nextTick(() => {
          // 在 DOM 中添加 my-component 組件
          this.renderComponent = true;
        });
      }
    }
  };
</script>

這里發(fā)生的事情:
1.最初renderComponent設(shè)置為true,因此my-component組件渲染
2.在forceRerender中我們立即設(shè)置renderComponentfalse
3.停止渲染組件my-component金矛,因?yàn)樵?code>v-if指令現(xiàn)在的值為false
4.在nextTick中將renderComponent上設(shè)置回true
5.現(xiàn)在該v-if結(jié)果為true芯急,因此我們my-component再次開始渲染

我們必須等到nextTick,否則我們不會(huì)看到任何變化驶俊。

在Vue中娶耍,一個(gè) nextTick 是一個(gè)DOM更新周期。Vue將收集在同一 nextTick 中進(jìn)行的所有更新饼酿,在 nextTick 結(jié)束時(shí)榕酒,它將根據(jù)這些更新來渲染 DOM 中的內(nèi)容。如果我們不等到nextTick故俐,我們對(duì)renderComponent的更新就會(huì)自動(dòng)取消想鹰,什么也不會(huì)改變。

其次药版,當(dāng)我們第二次渲染時(shí)辑舷,Vue將創(chuàng)建一個(gè)全新的組件。 Vue 將銷毀第一個(gè)槽片,并創(chuàng)建一個(gè)新的何缓,這意味著我們的新my-component將像正常情況一樣經(jīng)歷其所有生命周期-createdmounted等还栓。

不過碌廓,這并不是一個(gè)很好的解決方案,往下看剩盒。

使用forceUpdate

這是解決此問題的兩種最佳方法之一氓皱,此方法得到Vue的官方支持。

forceUpdate在組件實(shí)例本身以及全局實(shí)例上勃刨,可以通過兩種不同的方式調(diào)用:

// 全局
import Vue from 'vue';
Vue.forceUpdate();

// 使用組件實(shí)例
export default {
  methods: {
    methodThatForcesUpdate() {
      // ...
      this.$forceUpdate();
      // ...
    }
  }
}

重要提示:這不會(huì)更新您擁有的任何計(jì)算屬性波材。調(diào)用forceUpdate只會(huì)強(qiáng)制重新渲染視圖

最好的方法:修改組件的key達(dá)到組件重新渲染

在許多情況下,我們需要重新渲染組件身隐。

要正確地做到這一點(diǎn)廷区,我們將提供一個(gè)key屬性,以便 Vue 知道特定的組件與特定的數(shù)據(jù)片段相關(guān)聯(lián)贾铝。如果key保持不變隙轻,則不會(huì)更改組件埠帕,但是如果key發(fā)生更改,Vue 就會(huì)知道應(yīng)該刪除舊組件并創(chuàng)建新組件玖绿。

我們可以采用這種將key分配給子組件的策略敛瓷,但是每次想重新渲染組件時(shí),只需更新該key即可斑匪。

<template>
  <component-to-re-render :key="componentKey" />
</template>


export default {
  data() {
    return {
      componentKey: 0,
    };
  },
  methods: {
    forceRerender() {
      this.componentKey += 1;  
    }
  }
}

每次 forceRerender被調(diào)用時(shí)呐籽,我們的componentKey都會(huì)改變。當(dāng)這種情況發(fā)生時(shí)蚀瘸,Vue將知道它必須銷毀組件并創(chuàng)建一個(gè)新組件狡蝶。我們得到的是一個(gè)子組件,它將重新初始化自身并“重置”其狀態(tài)贮勃。

原文:https://hackernoon.com/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贪惹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子寂嘉,更是在濱河造成了極大的恐慌奏瞬,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泉孩,死亡現(xiàn)場(chǎng)離奇詭異硼端,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)棵譬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門显蝌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人订咸,你說我怎么就攤上這事曼尊。” “怎么了脏嚷?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵骆撇,是天一觀的道長。 經(jīng)常有香客問我父叙,道長神郊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任趾唱,我火速辦了婚禮涌乳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘甜癞。我一直安慰自己夕晓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布悠咱。 她就那樣靜靜地躺著蒸辆,像睡著了一般征炼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躬贡,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天谆奥,我揣著相機(jī)與錄音,去河邊找鬼拂玻。 笑死肴颊,一個(gè)胖子當(dāng)著我的面吹牛汽馋,可吹牛的內(nèi)容都是我干的衩匣。 我是一名探鬼主播矛辕,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼囤屹,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼熬甚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肋坚,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤乡括,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后智厌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诲泌,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年铣鹏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敷扫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诚卸,死狀恐怖葵第,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情合溺,我是刑警寧澤卒密,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站棠赛,受9級(jí)特大地震影響哮奇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜睛约,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一鼎俘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辩涝,春花似錦贸伐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽误辑。三九已至,卻和暖如春歌逢,著一層夾襖步出監(jiān)牢的瞬間巾钉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工秘案, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砰苍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓阱高,卻偏偏與公主長得像赚导,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赤惊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359