laravel 10插槽机制核心是默认插槽({{ $slot }})和命名插槽(),用于组件内结构化内容注入,支持多区域、可选渲染与嵌套复用,与模板继承中的@yield本质不同。

@yield 是布局占位符,不是内容容器
@yield('name') 只是预留一个“插入点”,它本身不承载内容,也不参与内容拼接逻辑。它要么显示传入的子模板内容,要么显示默认值(如 @yield('title', '首页')),但无法叠加、无法继承父级内容、无法被多次注入。
常见错误现象:在子模板里对同一个 @yield 多次使用 @section,只有最后一次生效;漏写 @extends 时,@yield 直接输出空字符串,不报错也不提示——这是静默失败,最难排查。
-
@yield必须出现在父模板中,且子模板必须通过@extends正确继承才能生效 - 名字大小写敏感,
@yield('Content')和@section('content')不匹配就丢内容 - 不能用
@parent,因为它没有“父内容”概念——它只是个开关
@slot 是组件的内容接收器,支持结构化分发
@slot(或 {{ $slot }}、{{ $header }})属于 Blade 组件机制,它把外部传入的内容封装成变量或闭包,在组件内部按需渲染。它天然支持多区域、可选、可组合,比如一个卡片组件可以同时接收 $slot(主体)、$header(标题)、$footer(操作区)。
使用场景明显不同:你不会用 @yield 去构建一个可复用的弹窗组件,但你会用 @slot ——因为弹窗需要灵活塞入标题、正文、按钮,而这些内容彼此独立、位置固定。
- 默认插槽内容直接写在
<x-card>...</x-card>标签体内,自动赋给$slot - 命名插槽要用
<x-slot name="footer"></x-slot>或<footer></footer> - 未定义
@slot('xxx')的命名插槽,对应变量(如$xxx)为null,建议用{{$footer ?? ''}}防错
它们根本不在同一层抽象上
@yield 是模板继承体系里的“静态占位”,绑定的是视图层级关系(layout → child);@slot 是组件系统里的“动态内容管道”,绑定的是封装单元(component)与调用上下文之间的数据流。Laravel 文档里常把两者并列讲,容易让人误以为功能相似,其实它们解决的问题完全不同。
性能影响也不同:@yield 编译后就是简单的 PHP 变量输出;@slot 涉及闭包传递和作用域隔离,稍重,但换来的是真正的复用能力——比如同一个 <x-alert></x-alert> 组件,在登录页、表单页、后台页里都能传不同的 $slot 和 $type 属性,而不用复制三份 @section。
- 不要试图用
@yield替代组件插槽,它没这个设计意图 - 也不要在一个
@extends模板里混用大量@section去模拟插槽行为——可读性差,维护成本高 - 修改组件后必须运行
php artisan view:clear,否则旧缓存可能让插槽内容不更新
什么时候该选哪个
判断依据很简单:你要复用的是「页面结构骨架」,还是「UI功能单元」?前者用 @yield + @section;后者用 @slot + <x-xxx></x-xxx>。
比如整个后台管理页共用一个 layouts.admin,侧边栏、顶部导航、主内容区都用 @yield 预留——这是骨架;但其中每个数据卡片、筛选表单、状态标签,都应该抽成带插槽的组件——这才是单元。
- 全局布局、SEO 元信息、基础样式加载 →
@yield - 按钮组、模态框、表格行、表单字段 →
@slot - 混合使用没问题,但别把组件插槽硬塞进
@section里去“扩展”——它不归那一层管
@yield 内容是在运行时由子模板直接覆盖的。这意味着插槽能做条件判断、循环包裹、属性透传,@yield 不能。











