具名插槽的 name 属性必须严格字符串匹配才能生效,大小写、空格、连字符均敏感,不匹配则内容静默丢弃或进入默认插槽;name 不支持动态绑定,仅接受静态字面量,且浏览器行为完全遵循 html 规范。

slot 的 name 属性不是“怎么用”的问题,而是“必须严格匹配才能生效”的问题。不一致就静默失效,没有错误提示,内容直接消失。
name 值必须完全一致,大小写、连字符、空格全算数
浏览器对 name 和 slot 属性执行字符串级精确比对,不自动转小写,不忽略空格,不 fallback。
-
<slot name="header"></slot>只接收<h1 slot="header">标题</h1> -
<h1 slot="Header"></h1>、<h1 slot="header "></h1>(末尾空格)、<h1 slot="header-2"></h1>全部不匹配,内容进默认插槽或被丢弃 - 所有主流浏览器(Chrome/Firefox/Safari/Edge)行为一致,这是 HTML 规范强制要求,不是 bug
不能动态绑定 name,只认静态字面量
name 是原生 HTML 属性,不是 Vue 或 React 的响应式字段。任何试图“动态生成”的写法都无效。
-
<slot :name="headerName"></slot>(Vue)→ 实际 DOM 中是name="headerName"字面量,不是变量值 -
<slot name="${slotName}"></slot>(模板字符串)→ 在 HTML 源码里直接报错或被当作文本渲染 - 真正有效的只有编译/运行时已确定的字符串:
<slot name="user-avatar"></slot>、<slot name="sidebar"></slot> - 想实现条件切换?用多个固定
<slot name="a"></slot>+v-if控制显隐,别碰name绑定
具名插槽和默认插槽共存时的分发逻辑
一个组件内可有多个具名插槽,但只能有一个无 name 的默认插槽(<slot></slot>),它的作用是兜底。
- 内容按
slot属性值逐字匹配具名插槽;匹配成功即分发,不再进入默认插槽 - 没写
slot属性,或写了但值不匹配任何name,才进默认插槽 - 重复声明同名插槽(如两个
<slot name="title"></slot>)允许,但只有第一个能捕获内容,其余为空 -
<slot name="aside">侧边栏默认内容</slot>的 fallback 仅在**完全没有**slot="aside"节点时触发;哪怕节点存在但为空(<div slot="aside"></div>),fallback 也不会显示
最容易卡住的地方:内容“不见了”却查不到错误——先检查 name 和 slot 是否逐字符一致,再确认父组件内容是否为自定义元素的直系子节点,最后验证是否误用了框架语法(比如在原生 Web Components 里写 v-slot)。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











