如何解決Vue3組合式API模式下動態(tài)組件不渲染問題
Vue3可以使用component組件渲染動態(tài)組件,將子組件名傳遞給:is指令就可以了。
官方在文檔中指出,傳遞到:is指令的值可以是:
(1)被注冊的組件名
(2)導入的組件對象
假設有以下需求,有以下兩個子組件,在父組件中需要根據其他條件動態(tài)加載:
<template>
<h3>我是動態(tài)子組件A</h3>
</template>
<style scoped>
h3 {
background-color: blue;
color: #fff;
}
</style>
<template>
<h3>我是動態(tài)子組件B</h3>
</template>
<style scoped>
h3 {
background-color: blueviolet;
color: #fff;
}
</style>
1. 將動態(tài)組件對象直接賦值給:is
在Vue3組合式API模式下,用component組件渲染動態(tài)組件,如果將動態(tài)組件對象直接賦值給:is指令是沒有問題的。
例如以下代碼:
模板代碼
<template>
<div>
<h3>組合API模式下動態(tài)組件的加載</h3>
<component :is="CompA" />
<component :is="CompB" />
</div>
</template>
<script setup lang="ts">
import CompA from "./CompA.vue";
</script>
TS代碼
<script lang="ts" setup> <script setup lang="ts"> import CompA from "./CompA.vue"; import CompB from "./CompB.vue"; </script> </script>
效果如下,是沒有問題的:

2. 通過動態(tài)組件名的方式賦值給:is無法實現
假若需要根據不同情況賦予:is指令不同的子組件,那么就需要用一個變量來存子組件名稱。
在組合api模式下,子組件是無法渲染的。
因為component組件的:is指令需要已注冊的組件對象。
請看如下代碼:
<template>
<div>
<h3>組合API模式下使用動態(tài)組件名加載子組件</h3>
<template v-for="comp in compArr" :key="comp.compName">
<component :is="comp.compName" />
</template>
</div>
</template>
<script setup lang="ts">
import CompA from "./CompA.vue";
import CompB from "./CompB.vue";
const compArr = [{ compName: "CompA" }, { compName: "CompB" }];
</script>
以上代碼會引起錯誤提示:兩個導入的子組件未使用:

而且在組合式API模式下,是不能顯式注冊子組件的,兩個子組件也并沒有按我們的預期渲染出來:

如何解決這個問題呢?
3. 使用組合式和選項式API結合的方式解決這個問題
在組合式API模式下,Vue是支持多個Script代碼塊的。
由于選項式API可以顯式注冊導入的子組件,可以另外寫一個選項式API模式的script來顯式注冊子組件。
這樣在component組件中,傳入已注冊子組件的名稱即可。
代碼如下:
// 專門定義一個選項式api模塊,來注冊組件
<script lang="ts">
import { defineComponent } from "vue";
import CompA from "./CompA.vue";
import CompB from "./CompB.vue";
export default defineComponent({
components: { CompA, CompB }
});
</script>
<script setup lang="ts">
const compArr = [{ compName: "CompA" }, { compName: "CompB" }];
</script>
兩個子組件已經成功渲染了。

總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Vue.js+express利用切片實現大文件斷點續(xù)傳
斷點續(xù)傳就是要從文件已經下載的地方開始繼續(xù)下載,本文主要介紹了Vue.js+express利用切片實現大文件斷點續(xù)傳,具有一定的參考價值,感興趣的可以了解下2023-05-05
this.$router.push攜帶參數跳轉頁面的實現代碼
這篇文章主要介紹了this.$router.push攜帶參數跳轉頁面,this.$router.push進行頁面跳轉時,攜帶參數有params和query兩種方式,本文結合實例代碼給大家詳細講解,需要的朋友可以參考下2023-04-04
vue開發(fā)中的base和publicPath的區(qū)別
本文主要介紹了vue開發(fā)中的base和publicPath的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-07-07

