Laravel 10+只认<x-slot:xxx>语法,<x-slot name="xxx">会静默失效;命名插槽变量如$header未用@isset或??判断则报Undefined variable错误;默认插槽必须写{{ $slot }},不可加括号调用。

Blade组件中和哪个能用?
只认 <x-slot:xxx>,<x-slot name="xxx"> 在 Laravel 10+(含 11)里会静默失效——内容不报错也不渲染,直接丢弃。这是 Laravel 7+ 统一语法后明确规定的,不是浏览器兼容问题,是 Blade 编译器解析规则。旧项目升级后如果沿用 name="xxx" 写法,命名插槽就成“透明黑洞”。
$header 这类变量为什么有时报 Undefined variable?
命名插槽变量(如 $header、$footer)不会自动声明,只在你用了对应 <x-slot:header> 时才存在。没传就访问,PHP 直接抛 Undefined variable: header。这不是配置问题,是变量作用域机制决定的。
-
{{ $header ?? '' }}可防报错,但空字符串仍会渲染出空 DOM 节点 -
@isset($header){{ $header }}@endisset更安全,整块结构完全跳过 - 别写
@props(['header' => ''])—— Blade 组件不支持这种 props 声明,无效
默认插槽 $slot 能不能当函数调用?
不能。写成 {{ $slot() }} 是 Laravel 6 及更早的旧语法,Laravel 7+ 已彻底移除。现在 $slot 就是个 Illuminate\View\ComponentSlot 实例,直接 {{ $slot }} 渲染即可。调用它会报 Call to undefined method ...::__invoke()。
-
{{ $slot }}是唯一正确写法 -
@empty($slot)可判断是否为空内容(注意:空格也算内容,@empty不等价于!$slot) - 混用命名插槽和默认插槽时,
$slot永远是字符串或空字符串,不是 null
跨 Laravel 8/9/10/11 的 Slot 兼容底线是什么?
只要坚持三件事,就能横跨所有现行版本(8.0 到 11.x):
用 <x-slot:xxx> 不用 name="xxx";
所有命名插槽变量都加 @isset 或 ??;
默认插槽只写 {{ $slot }} 不加括号。
真正容易被忽略的是:组件内没定义 $footer 却写了 {{ $footer }},哪怕只在一个分支里漏掉 @isset,上线后某个页面就会炸开——而且错误只在该插槽被使用时触发,极难复现。


















