vue3如何解決slot深層透傳問題
vue3解決slot深層透傳問題
問題
組件嵌套導(dǎo)致的層級過深,slot難以傳入到指定組件,一層層傳又低效,并且增加維護(hù)成本。
解決方式
利用 provide 和 inject 及 h() 函數(shù) 以及 vnode 實(shí)現(xiàn)slot透傳
父容器中定義了插槽后,通過 provide 往后傳輸 slot 的虛擬 DOM 節(jié)點(diǎn) (vnode):

slot組件中使用 inject 接收到父容器傳輸?shù)膕lots后,通過渲染函數(shù) h() 渲染虛擬 DOM 節(jié)點(diǎn) (vnode),從而實(shí)現(xiàn)slot在任意深層組件使用:

使用方式
任意的深層組件引用slot組件并獲取需要的slot DOM進(jìn)行渲染即可
- 父容器代碼:
<template>
<div class="TablePageBox">
<!--父容器中使用插槽-->
<template v-slot:test="{ arg }">
<span class="slot-a">
{{ arg.code }}
</span>
</template>
</div>
</template>
<script lang="ts">
import { provide, defineComponent } from 'vue';
export default defineComponent({
name: 'box',
setup(ctx: any) {
provide('tableSlots', ctx.slots);
return {};
}
});
</script>
- slot組件代碼:
<script lang="ts">
import { defineComponent, h, inject } from 'vue';
export default defineComponent({
name: 'testSlots',
props: ['prop1', 'prop2'],
setup(props: any, ctx: any) {
return {
props,
ctx
};
},
render(getup: any) {
const { props } = getup;
const template = (inject('testSlots') as any)?.['test'];
return h(template, props);
}
});
</script>總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決VUE項(xiàng)目localhost端口服務(wù)器拒絕連接,只能用127.0.0.1的問題
這篇文章主要介紹了解決VUE項(xiàng)目localhost端口服務(wù)器拒絕連接,只能用127.0.0.1的問題2020-08-08
Vue2.X和Vue3.0數(shù)據(jù)響應(yīng)原理變化的區(qū)別
這篇文章主要介紹了Vue2.X和Vue3.0數(shù)據(jù)響應(yīng)原理變化的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
vite+vue3項(xiàng)目中svg圖標(biāo)組件封裝的過程詳解
這篇文章主要介紹了vite+vue3項(xiàng)目中svg圖標(biāo)組件封裝的過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03
Vue+Koa2+mongoose寫一個像素繪板的實(shí)現(xiàn)方法
這篇文章主要介紹了Vue+Koa2+mongoose寫一個像素繪板的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

