默认插槽是未被具名插槽匹配的内容的唯一接收通道,非兜底机制;不写name属性即为默认插槽,仅允许一个,父组件无slot属性或slot值不匹配的节点均进入其中。

没写 name 属性的 <slot> 就是默认插槽,但它不是“fallback”或“兜底”,而是有明确分发规则的独立通道——内容只要没被具名插槽收走,就全进这里。
没写 name 的 <slot> 就是默认插槽
浏览器不关心你叫它“默认”还是“匿名”,只看有没有 name 属性。只要没写 name,这个 <slot> 就自动成为默认插槽。它和具名插槽是并列关系,不是降级选项。
- 一个组件里只能有一个无
name的<slot>;写多个会被忽略(只有第一个生效) - 父组件中没带
slot属性的子节点,全部进入这个插槽 - 父组件写了
slot="xxx"但子组件没声明<slot name="xxx">,这些节点也进默认插槽 - 如果组件里一个
<slot>都没写,所有传入内容直接丢弃,DOM 中不可见
name="" 和不写 name 效果一样吗
不一样。<slot name=""> 是合法 HTML,但它的 name 是空字符串,只会匹配 slot="" 的节点——而现实中几乎没人这么写。不写 name 才是真正的默认插槽行为。
-
<slot>→ 接收所有未被具名插槽捕获的内容 -
<slot name="">→ 只接收<div slot="">这种极少见的写法,其他内容全丢弃(除非还有别的<slot>) - 调试时可以用
slotElement.assignedNodes()看返回是否为空,确认内容是否真的进来了
默认插槽里写默认内容会怎样
可以写,默认内容只在插槽“空着”时显示。但要注意:只要父组件传了任何节点(哪怕 <div></div>),默认内容就会被完全替换,不会叠加。
立即学习“前端免费学习笔记(深入)”;
-
<slot>这里是默认正文</slot>→ 父组件不传内容时显示“这里是默认正文” - 父组件写了
<my-card><p>Hello</p></my-card>→ “Hello” 替换掉整段默认文字,不保留也不拼接 - 想实现“有内容则显示内容,没内容才显示默认文案”,就得靠 JS 判断
assignedNodes().length === 0再控制显隐
常见踩坑点:大小写、动态绑定、多 slot 冲突
默认插槽本身不涉及 name,但容易被具名插槽的错误写法连累——比如大小写不一致导致内容全进了默认插槽,你以为它“兜底”了,其实只是匹配失败。
- 父组件写了
<h2 slot="Header">,子组件却是<slot name="header">→ 内容进默认插槽,不是“智能修正” - 试图用
<slot :name="dynamicName">或<slot name="{{name}}">→ 解析后name就是字面量字符串,不是变量值 - 写了两个无
name的<slot>→ 后面那个无效,内容不会分流,全进第一个
真正关键的是:默认插槽不是“容错机制”,它是分发链的最后一环。内容进没进来,取决于前面具名插槽是否严格匹配——而不是它自己有多“智能”。



















