默认插槽直接写{{ $slot }},不可调用;命名插槽name必须与组件内变量名完全一致且大小写敏感;父级变量不进入插槽作用域;未传命名插槽需用{{ $header ?? '' }}兜底。

默认插槽不是函数,别写 $slot()
这是新手最常踩的坑:看到 $slot 就下意识当成函数调用,写成 {{ $slot() }}。Laravel 7+ 的 $slot 是一个 Illuminate\View\ComponentSlot 实例,直接输出即可 —— 它内部已封装好渲染逻辑。写成函数调用会报错 Call to undefined function $slot() 或静默失败(内容不显示)。
正确写法只有这一种:{{ $slot }}。它不是变量值拼接,也不是方法调用,就是原样输出传入的 Blade 片段。
x-slot 的 name 必须和组件内变量名完全一致
命名插槽不是“只要写了 name="header" 就能用”,它必须和组件模板里实际引用的变量名严格匹配。比如组件里写的是 {{ $header }},那调用时就必须用 <x-slot name="header"></x-slot>;如果组件里写的是 {{ $title }},那 name="header" 就完全无效,内容会被丢弃,且无任何报错提示。
- 变量名大小写敏感:
name="Header"≠$header - 不能带下划线或驼峰混用:
name="card_header"对应的必须是{{ $card_header }},不是{{ $cardHeader }} - 没定义的命名插槽变量(如写了
<x-slot name="footer"></x-slot>但组件里没{{ $footer }})—— 内容直接消失,不会报错也不会警告
父级变量不会自动进入插槽作用域
你在父视图中定义了 @php $user = auth()->user(); @endphp,然后在 <x-card></x-card> 里用 <x-slot name="header">{{ $user->name }}</x-slot> —— 这会报错 Undefined variable: user。因为插槽内容是在组件作用域内渲染的,父级变量默认不可见。
解决方式只有两个:
- 把数据作为属性传进去:
<x-card :user="$user"></x-card>,然后在组件里通过@props(['user'])接收 - 在
<x-slot></x-slot>标签内直接写静态内容或只使用该 slot 能访问到的变量(比如组件自己定义的$title)
空插槽不加判断会触发 Undefined variable 错误
如果你写了 {{ $header }} 但调用时没传 <x-slot name="header"></x-slot>,Blade 会直接报错 Undefined variable: header。Laravel 不会自动设为 null 或空字符串。
必须显式兜底:
- 用空合并运算符:
{{ $header ?? '' }} - 用
@isset($header)包裹整块区域 - 不要依赖
@props自动填充命名插槽 ——@props只处理属性,不处理插槽
这点和 $slot 不同:$slot 即使没传内容也安全(输出空字符串),但所有命名插槽变量都必须手动判空。


















