slot 透传并获取 slotProps
// grandparent
<Parent :first-day-of-week="0" :test-prop="1999999999" :date="new Date()">
<template v-slot:monthCellRender="slotProps">
<h2>
month: {{ slotProps.month }}
</h2>
</template>
<template v-slot:dateCellRender="slotProps">
<h3 style="background-color: #eef;">
date: {{ slotProps.date }}
</h3>
</template>
</Parent>
// parent component(Parent)
<Child>
<template v-for="(value, slotKeyName) in $scopedSlots" v-slot:[slotKeyName]="slotProps">
<slot :name="slotKeyName" v-bind="slotProps"></slot>
<div :key="slotKeyName">{{ slotKeyName }}</div>
</template>
</Child>
// child
<slot name="dateCellRender" v-bind="item"></slot>
从 2.6.0 开始,这个 $scopedSlots 有两个变化:
- 作用域插槽函数现在保证返回一个 VNode 数组,除非在返回值无效的情况下返回 undefined。
- 所有的 $slots 现在都会作为函数暴露在 $scopedSlots 中。如果你在使用渲染函数,不论当前插槽是否带有作用域,我们都推荐始终通过 $scopedSlots 访问它们。这不仅仅使得在未来添加作用域变得简单,也可以让你最终轻松迁移到所有插槽都是函数的 Vue 3。
参考资料:
https://cn.vuejs.org/v2/api/#slot
https://cn.vuejs.org/v2/api/#vm-scopedSlots
动态插槽名:https://cn.vuejs.org/v2/guide/components-slots.html#%E5%8A%A8%E6%80%81%E6%8F%92%E6%A7%BD%E5%90%8D