• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    vue3如何解决slot深层透传问题

    发布者: 竹韵 | 发布时间: 2025-6-14 15:33| 查看数: 34| 评论数: 0|帖子模式

    vue3解决slot深层透传问题


    问题

    组件嵌套导致的层级过深,slot难以传入到指定组件,一层层传又低效,并且增加维护成本。

    解决方式

    利用 provide 和 inject 及 h() 函数 以及 vnode 实现slot透传
    父容器中定义了插槽后,通过 provide 往后传输 slot 的虚拟 DOM 节点 (vnode):

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


    使用方式

    任意的深层组件引用slot组件并获取需要的slot DOM进行渲染即可

    • 父容器代码:
    1. <template>
    2.   <div class="TablePageBox">
    3.     <!--父容器中使用插槽-->
    4.     <template v-slot:test="{ arg }">
    5.       <span class="slot-a">
    6.         {{ arg.code }}
    7.       </span>
    8.     </template>
    9.   </div>
    10. </template>

    11. <script lang="ts">
    12. import { provide, defineComponent } from 'vue';
    13. export default defineComponent({
    14.   name: 'box',
    15.   setup(ctx: any) {
    16.     provide('tableSlots', ctx.slots);
    17.     return {};
    18.   }
    19. });
    20. </script>
    复制代码

    • slot组件代码:
    1. <script lang="ts">
    2. import { defineComponent, h, inject } from 'vue';

    3. export default defineComponent({
    4.   name: 'testSlots',
    5.   props: ['prop1', 'prop2'],
    6.   setup(props: any, ctx: any) {
    7.     return {
    8.       props,
    9.       ctx
    10.     };
    11.   },
    12.   render(getup: any) {
    13.     const { props } = getup;
    14.     const template = (inject('testSlots') as any)?.['test'];
    15.     return h(template, props);
    16.   }
    17. });
    18. </script>
    复制代码
    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    来源:https://www.jb51.net/javascript/339908rp2.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表