Slot用于注入HTML片段,传值用于传递数据;默认插槽自动接收未命名内容,命名插槽通过驼峰变量名(如$cardFooter)访问,二者职责分明、不可互换。

Slot 是内容,传值是数据
Slot 解决的是「往组件里塞 HTML 片段」的问题,比如一段标题、按钮组、表单字段;传值(:prop 或 prop="string")解决的是「往组件里传变量或逻辑参数」的问题,比如 :disabled="$isLocked"、size="sm"。两者根本不在一个维度:一个是结构注入,一个是状态控制。
常见错误现象:
把按钮文字写成 :label="$text" 而不是放进 $slot ——结果文字被转义或无法嵌套标签;反过来,把整个 <x-button><svg>...</svg> 确认</x-button> 的内容用 :content 传进去,又得手动 {!! $content !!},失去 Blade 安全渲染优势。
- 默认插槽(
$slot)自动接收组件标签内的所有未命名内容,不需声明,也不走 PHP 变量绑定流程 - 命名插槽(如
$header)对应<x-slot name="header">...</x-slot>,变量名由插槽名自动驼峰转换(card-footer→$cardFooter) - 传值必须在组件类的
@props中显式声明,否则会触发Undefined array key错误
什么时候必须用 Slot
当你需要在组件内部保留 HTML 结构能力、支持子组件嵌套、或让调用方控制语义标签时,Slot 是唯一选择。
典型场景:
• 卡片主体要支持 <p></p>、<ul></ul>、甚至另一个 <x-alert></x-alert>
• 模态框 footer 需要放两个按钮 + 一个 <x-loading></x-loading>
• 表单字段 wrapper 要包裹原生 <input> 和自定义错误提示
- Slot 内容在渲染时仍处于 Blade 上下文,可直接使用
@foreach、{{ $user->name }}等 - 命名插槽支持条件判断:
@if(filled($footer)) {{ $footer }} @endif,但不能对$slot直接@empty——它永远是字符串,空内容也是"" - 不要试图用
:slot-content="..."替代$slot:Blade 不识别这种写法,会当成普通属性丢进 HTML 标签里
什么时候该用传值而不是 Slot
当信息是纯配置、无结构、不涉及 HTML 或 Blade 逻辑时,传值更轻量、更可控。
典型例子:
• <x-button type="primary" size="lg" :disabled="$form->isSubmitted()"></x-button>
• <x-alert title="保存成功" :type="'success'" :duration="3000"></x-alert>
• <x-input name="email" :error="$errors->first('email')"></x-input>
- 字符串字面量不加冒号:
type="danger"→ 组件内收到字符串"danger" - PHP 表达式必须加冒号:
:type="$alertType"→ 组件内收到变量值 - 传值不经过视图编译,性能略高;但 Slot 内容会在组件渲染时实时解析,适合动态内容
- 传值能配合组件类的
mount()或属性类型提示做校验,Slot 完全依赖调用方,无法约束结构
混合使用才真正灵活
绝大多数真实组件既需要传值控制行为,又需要 Slot 注入结构。关键在于分清职责边界。
比如一个 <x-card></x-card>:
• 用传值控制外观::shadow="true"、variant="outline"
• 用命名插槽放标题:<x-slot name="header">用户列表</x-slot>
• 用默认插槽放表格:<table>...</table>
• 用传值传递数据::items="$users"(供组件内部循环,而非塞进 $slot)
- 避免把数据循环逻辑放进 Slot —— 那会让调用方重复写
@foreach,违背组件复用初衷 - 命名插槽变量名和
<x-slot name="xxx"></x-slot>必须完全一致(含大小写),Laravel 不做容错转换 - 修改组件模板后,别忘了运行
php artisan view:clear,否则旧缓存可能让 Slot 不生效
最易被忽略的一点:Slot 是运行时内容分发机制,它不参与组件类的生命周期;而传值会进入组件实例属性,在 mount() 或 render() 中可被 PHP 逻辑处理。选错就等于把结构问题交给数据层,或者把配置问题扔给模板层。

















