命名插槽变量名必须与x-slot的name属性完全一致,且区分大小写、不自动转换;未传入时为null,需用@isset($var)包裹渲染,不可用??''或@props定义,多插槽需各自判空。

命名插槽变量名必须与x-slot的name属性完全一致
Blade 不做大小写转换或驼峰转短横线处理,name="header" 对应组件内必须用 $header,写成 $Header 或 $cardHeader 都会报 Undefined variable: header。Laravel 10+ 不会自动映射、不支持别名、不 fallback 到默认值——变量未定义就是未定义。
常见错误包括:
- 在组件里写
{{ $cardHeader }},但调用时用<x-slot name="header"></x-slot> - 拼错 name 值,比如
<x-slot name="hedear"></x-slot>(少了个 r) - 混用空格和下划线:
name="main-content"对应的变量是$main-content—— 这在 PHP 中非法,直接 Parse Error
x-slot 标签语法不能写成 @slot 或 <slot></slot>
Laravel 7+ 已彻底弃用 @slot 和裸 <slot></slot> 语法。写 @slot('header') 或 <slot name="header"></slot> 会导致内容被静默丢弃,或触发 Undefined variable 错误(因为变量根本没注入)。
正确写法只有两种(Laravel 10 兼容):
-
<x-slot name="header">...</x-slot>(推荐,语义清晰) -
<header>...</header>(冒号语法,等价但易被 IDE 误标)
注意:name 属性值必须是纯字符串,不能是变量:<x-slot :name="$section"></x-slot> 在 Blade 组件调用中不生效——命名插槽名必须字面量固定。
命名插槽变量默认为 null,不判空直接渲染会出错
Blade 不会像 $slot 那样自动初始化命名插槽变量。如果没传 <x-slot name="footer"></x-slot>,$footer 就是 null,不是空字符串。直接写 {{ $footer }} 会触发 Notice;用 {{ $footer ?? '' }} 虽能避免报错,但若插槽内容含 HTML,?? '' 会强制转义整个结构,破坏预期渲染。
更安全的做法是:
- 用
@isset($footer){{ $footer }}@endisset—— 保留原始 HTML,且只在有内容时渲染整块 DOM - 避免包裹空
<div class="footer">{{ $footer ?? '' }}</div>,否则即使没传 footer,也会渲染一个空 div - 不要在组件顶部写
@props(['header' => ''])——@props只对属性有效,对命名插槽变量无效
多个命名插槽共存时,变量作用域互不干扰但需各自判空
一个组件里可以同时定义 $header、$aside、$footer,它们彼此独立,不存在继承或覆盖关系。但每个都得单独处理存在性——漏掉任何一个的 @isset,就可能在线上环境突然报错。
典型反例:
- 写了
@isset($header){{ $header }}@endisset,但忘了$footer同样需要包裹 - 在同一个组件中混用
{{ $slot }}和{{ $header }},却用@empty($slot)判断主体是否为空 ——$slot是Illuminate\View\ComponentSlot实例,@empty不适用,要用@if($slot->isNotEmpty())或@if($slot->toHtml())
最稳妥的方式是:所有命名插槽变量,统一用 @isset 包裹整段 DOM 结构,而不是只包变量本身。











