props 传的是「数据」,插槽传的是「一段界面」。子组件里放 <slot> 当坑,父组件标签内的内容就填进去。
插槽分三种:默认插槽(一个坑)、具名插槽(header/body/footer 多个坑)、作用域插槽(子组件把自己的数据「反传」给父,让父决定长相)。
| 类型 | 子组件(挖坑) | 父组件(填坑) |
|---|---|---|
| 默认插槽 | <slot>兜底内容</slot> | 标签里直接写内容 |
| 具名插槽 | <slot name="header">…</slot> | <template #header>(旧:slot="header") |
| 作用域插槽 | <slot :row="row"></slot> | <template #default="{ row }">(旧:v-slot="{row}") |
差异:Vue2 用 slot="name" + <slot-scope>,Vue3 统一成 v-slot(缩写 #)且只能加在 <template> 上;this.$slots 在 Vue3 变成渲染函数。# 缩写只在 JS template 字符串/SFC 里安全,纯 in-DOM 模板里建议写全名 v-slot:header。