94人参与 • 2025-04-24 • Javascript
组件嵌套导致的层级过深,slot难以传入到指定组件,一层层传又低效,并且增加维护成本。
利用 provide 和 inject 及 h() 函数 以及 vnode 实现slot透传
父容器中定义了插槽后,通过 provide 往后传输 slot 的虚拟 dom 节点 (vnode):

slot组件中使用 inject 接收到父容器传输的slots后,通过渲染函数 h() 渲染虚拟 dom 节点 (vnode),从而实现slot在任意深层组件使用:

任意的深层组件引用slot组件并获取需要的slot dom进行渲染即可
<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>
<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>以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论