由于业务须要,咱们的vue组件分了不少层。但我须要在父组件经过slot指定模板,但不在子组件渲染,而是在孙组件或是再下方的组件去渲染。vue
好比,我有一个通用的A组件,A组件内引用了B组件,B组件又引用了C组件。C组件的模板内有一部分是须要在A组件中来配置的。node
由于中间间隔了1层以上的组件,因此无法经过通常的slot方式解决。因而研究了一下vue的scoped-slots,感慨vue的设计真是很灵活,能够很方便实现。函数
一、首先,引用A组件的模板:spa
<div> ...
<A> <span slot="nodeMenu" slot-scope="{node}">{{node.text}}</span>
</A> ... </div>
2.一、若是B组件是模板方式,引用B组件的模板:设计
<div> ...
<B> <span slot="nodeMenu" slot-scope="{node}"> <slot name="nodeMenu" :node="node"></slot> </span>
</B> ... </div>
2.二、若是B组件是经过render的脚本方式渲染的,能够这样:code
render(h){ return h(ComponentC, { props: { ... }, scopedSlots: self.$scopedSlots, on: { ... } }) }
三、C的模板:blog
<div v-for="treeNode in nodes"> ... <slot name="nodeMenu" :node="treeNode"></slot> ... </div>
经过分析Vue源码,Vue的scopedSlots中是一个个渲染函数(并非VNode)。在B组件中经过这些函数传递给C组件,从而实现了跨层传递slots。源码