默认插槽即$slot,接收组件标签内未命名的内容;命名插槽通过<x-slot name="xxx">绑定变量如$header,需严格匹配名称且用@isset或??避免报错,二者常混合使用以兼顾灵活性与语义清晰。

默认插槽就是 $slot,没名字的都算它
Blade 里只要组件模板里写了 {{ $slot }},就代表那里接收“没指定名字”的内容。你在用组件时,直接写在 <x-card>...</x-card> 标签中间的内容,全归它管——不管是一行文本、一个 <p> 还是嵌套的 <x-button>,统统塞进 $slot 变量里渲染。
常见错误现象:把命名插槽内容误写在组件标签体里,结果它被当成默认插槽内容渲染到错误位置(比如 footer 文字跑到了 body 区域)。
- 默认插槽只能有一个,且不能重复声明
- 它不支持
@isset($slot)判断是否为空——$slot总是存在,哪怕为空字符串 - 如果组件同时需要主内容和多个区域,
$slot必须配合命名插槽使用,不能替代后者
具名插槽靠 x-slot 的 name 属性绑定变量名
具名插槽不是靠模板里写 <slot name="header"></slot>(那是 Vue 写法),Laravel Blade 里完全不用 <slot> 标签。你只管在组件模板里定义变量,比如 {{ $header }}、{{ $footer }},然后调用时用 <x-slot name="header"> 去填值。
关键点:变量名必须和 name 属性值**完全一致**,大小写敏感,且不能含空格或特殊字符。
- 命名插槽变量默认为
null,所以要用@isset($header)或{{$header ?? ''}}避免报错 - 同一个组件可以有任意多个具名插槽,但每个
name值只能出现一次(重复会覆盖) - 不要试图用
$slot和具名插槽变量同名(比如定义{{ $header }}又在标签体里写内容),会导致逻辑混乱
怎么判断该用哪个?看内容是不是“有固定语义位置”
如果你要传的内容天然属于某个明确区域——比如模态框顶部标题、表格操作栏、卡片底部按钮——那就必须用具名插槽。否则,所有内容挤在一块,后期改样式或加逻辑会非常痛苦。
反过来说,如果只是“这里放一段描述文字”“这里渲染用户列表”,没有强位置语义,用默认插槽更轻量。
- 具名插槽让组件接口更清晰,但增加调用成本;默认插槽简单,但扩展性差
- 混合使用很常见:主体用
$slot,头尾用$header/$footer - 别为了“看起来高级”硬加具名插槽——没被
@isset包裹的具名变量一旦漏传,页面直接报错
x-slot 的语法细节容易踩坑
最常出错的是冒号和引号混用:<x-slot:header> 是旧写法(Laravel 9 及以前),Laravel 10 **必须用 <x-slot name="header">**,否则解析失败,内容不渲染。
另一个坑是空格:写成 <x-slot name = "header">(等号两边有空格)会导致 Laravel 解析失败,报错 Undefined variable: header。
- 具名插槽内容里可以嵌套其他组件、PHP 表达式甚至 Blade 指令,和默认插槽能力一致
-
x-slot标签必须作为<x-xxx>的直接子元素,不能套在<div>里再丢进去 - 如果组件没定义
$header,但你写了<x-slot name="header">,内容会被忽略,不报错也不渲染

















