《圖解Vue3.0》- 第14節(jié) 動(dòng)態(tài)組件和異步組件

動(dòng)態(tài)組件

在內(nèi)置指令中,有一個(gè)指令is,使用它可以實(shí)現(xiàn)動(dòng)態(tài)組件。
使用動(dòng)態(tài)組件方式:
<component :is="currentView"></component>

示例

dynamic.vue

<template>
  <div style="padding: 30px">
    <button @click="change('1')">組件1</button>
    <button @click="change('2')">組件2</button>
    <button @click="change('3')">組件3</button>
    <component :is="componentTag"></component>
  </div>
</template>

<script>
import { defineComponent } from '@vue/composition-api';
import component1 from '@/components/動(dòng)態(tài)組件/component1';
import component2 from '@/components/動(dòng)態(tài)組件/component2';
import component3 from '@/components/動(dòng)態(tài)組件/component3';

export default defineComponent({
  components: { component1, component2, component3 },
  data() {
    return {
      componentTag: ''
    }
  },
  methods: {
    change(index) {
      this.componentTag = 'component' + index
    },
  }
})
</script>

compoent1/2/3.vue

<template>
    <div class="container">
        我是組件1的內(nèi)容
    </div>    
</template>

<script>
import { defineComponent } from '@vue/composition-api'

export default defineComponent({
    created() {
        console.log('1已創(chuàng)建');
    },
    beforeUnmount() {
        console.log('1待銷毀');
    },
})
</script>

在動(dòng)態(tài)組件上使用 keep-alive

不知道在上面的例子中,大家有沒有發(fā)現(xiàn)一個(gè)問題,就是當(dāng)組件切換時(shí),組件會(huì)被銷毀。那么,如果為了提升性能,我能不能在切換的時(shí)候不銷毀組件呢?自然是可以的,就是加上keep-alive。它的功能就是保持組件的狀態(tài),以避免反復(fù)重渲染導(dǎo)致的性能問題。

這里僅做了了一點(diǎn)變化:

    <keep-alive>
        <component :is="componentTag"></component>
    </keep-alive>

dynamic.vue

<template>
  <div style="padding: 30px">
    <button @click="change('1')">組件1</button>
    <button @click="change('2')">組件2</button>
    <button @click="change('3')">組件3</button>
    <keep-alive>
        <component :is="componentTag"></component>
    </keep-alive>
  </div>
</template>

<script>
import { defineComponent } from '@vue/composition-api';
import component1 from '@/components/動(dòng)態(tài)組件/component1';
import component2 from '@/components/動(dòng)態(tài)組件/component2';
import component3 from '@/components/動(dòng)態(tài)組件/component3';

export default defineComponent({
  components: { component1, component2, component3 },
  data() {
    return {
      componentTag: ''
    }
  },
  methods: {
    change(index) {
      this.componentTag = 'component' + index
    },
  }
})
</script>

異步組件

// TODO
學(xué)習(xí)vue router 時(shí)再完成此部分內(nèi)容

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容