Vue跨层级传递slot的方法

因为业务需要,我们的vue组件分了很多层。但我需要在父组件通过slot指定模板,但不在子组件渲染,而是在孙组件或是再下方的组件去渲染。

比如,我有一个通用的A组件,A组件内引用了B组件,B组件又引用了C组件。C组件的模板内有一部分是需要在A组件中来配置的。

因为中间间隔了1层以上的组件,所以没法通过一般的slot方式解决。于是研究了一下vue的scoped-slots,感慨vue的设计真是很灵活,可以很方便实现。

 

1、首先,引用A组件的模板:

<div>
    ...
<A>
<span slot="nodeMenu" slot-scope="{node}">{{node.text}}</span>
</A>
... </div>

 

2.1、如果B组件是模板方式,引用B组件的模板:

<div>
    ...
<B>
<span slot="nodeMenu" slot-scope="{node}"> <slot name="nodeMenu" :node="node"></slot> </span>
</B>
... </div>

2.2、如果B组件是通过render的脚本方式渲染的,可以这样:

render(h){
    return h(ComponentC, {
        props: {
            ...
        },
        scopedSlots: self.$scopedSlots,
        on: {
           ...
        }
    })
}

 

3、C的模板:

<div v-for="treeNode in nodes">
    ...
    <slot name="nodeMenu" :node="treeNode"></slot>
    ...
</div>

 

 

通过分析Vue源码,Vue的scopedSlots中是一个个渲染函数(并不是VNode)。在B组件中通过这些函数传递给C组件,从而实现了跨层传递slots。

 

转载于:https://www.cnblogs.com/hz-blog/p/vue-slots-transmit-through-levels.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值