30人参与 • 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 举报,一经查实将立刻删除。
发表评论