插槽不显示的主因是name与slot属性值字符串不完全匹配,vue 3已废弃slot属性改用v-slot,v-if不可直接作用于slot标签,同名slot仅首项生效,空节点也会阻止fallback渲染。

slot name 字符串必须完全一致
内容“消失”但控制台没报错,大概率是 name 和 slot 属性值不匹配。Vue 和原生 Web Components 都做纯字符串比对,大小写、空格、连字符一个都不能错。
-
<slot name="header"></slot>不接收<h1 slot="Header">标题</h1>(H大写) -
<slot name="user-info"></slot>不接收<div slot="userinfo"></div>(少连字符) -
<slot name="main"></slot>不接收<section slot=" main"></section>(开头空格)
建议直接复制粘贴 name 值,或用 console.log 打印父组件中节点的 getAttribute('slot') 看实际值。
Vue 3 中 slot="xxx" 已被完全废弃
如果你用的是 Vue 3(包括 uview-plus、uni-app 3.x、Element Plus 等),slot="title" 这种写法会被编译器直接忽略——它不是“不生效”,而是压根没被识别为插槽入口。
- ❌ 错误:
<view slot="title">内容</view> - ✅ 正确:
<template v-slot:title><view>内容</view></template>或简写<template></template> -
v-slot必须用在<template></template>标签上,不能直接写在普通元素(如<div>、<code><view></view>)上检查
package.json里的vue版本,只要 ≥ 3.0,就别再碰slot属性。v-if 别直接写在
标签上 <slot v-if="show"></slot>是个高危写法:条件为 false 时,整个<slot></slot>节点被移除,父组件传的内容根本不会进入编译流程,自然无处可渲染。- ❌ 错误:
<slot name="header" v-if="showHeader"></slot> - ✅ 正确:
<div v-if="showHeader"><slot name="header"></slot></div> - 在 uni-app 小程序里尤其敏感,
<template v-slot:header v-if="show"></template>可能直接白屏,应改用嵌套:<template v-if="show"><template v-slot:header>...</template></template>
多个同名 slot 入口只取第一个
如果你写了两个
<h2 slot="title">A</h2>和<h2 slot="title">B</h2>,只有 A 会出现在<slot name="title"></slot>位置,B 被静默丢弃。这不是 bug,是规范行为。需要多实例时,不要堆叠同名
slot属性节点,而应:- 改用作用域插槽 + 循环渲染
- 或让父组件传一个数组,子组件内部
v-for - 或把结构控制权交给子组件,父组件只传数据
fallback 内容也容易被误判:哪怕有一个空节点(
<div slot="aside"></div>),<slot name="aside">默认内容</slot>也不会显示 fallback——它只看“有没有匹配节点”,不关心节点是否为空。 - ❌ 错误:











