Slot适合结构固定、内容多变的UI单元,如卡片、模态框等;默认插槽{{ $slot }}接收主体内容,具名插槽通过<x-slot name="xxx">注入指定区域,语义清晰、复用性强,而@include仅适合纯静态复用。

Slot 适合结构固定、内容多变的 UI 单元
比如卡片、模态框、表单字段这类「外壳不变,里面内容常换」的场景。$slot 和 <x-slot></x-slot> 天然支持内容注入,不用为每种内容写新 @include 路径或传一堆变量。组件定义一次,调用时直接塞 HTML 或 Blade 片段,语义清晰、维护成本低。
@include 更适合纯静态复用或简单变量替换
当只是把一段 HTML(比如页脚、广告位)在多个页面重复插入,且不涉及交互逻辑、不需传复杂数据时,@include('partials.footer') 确实更轻量。它不走组件注册流程,也不需要 PHP 类文件,改完模板就能立刻生效。
- 但一旦要传多个变量,比如
@include('card', ['title' => $t, 'body' => $b, 'actions' => $a]),参数越来越多,容易漏传、类型难约束 - 无法嵌套结构化内容:你不能在
@include里塞一个<h2></h2>加一段@foreach再加按钮 —— 它只接受数组参数,不支持子模板嵌入 - 没有作用域隔离:
$title在 included 文件里和父模板共享变量名,容易被意外覆盖
Slot 的坑:缓存和命名必须对得上
常见错误是组件里写了 {{$header}},但调用时用了 <x-slot name="title"></x-slot> —— 名字不匹配,内容就丢了。Laravel 不报错,只是静默忽略。
- 命名插槽必须和组件模板里的变量名完全一致(包括大小写)
- 修改了
.blade.php组件文件后,如果页面没更新,先跑php artisan view:clear,Blade 缓存不自动刷新 - 默认插槽
{{$slot}}只能出现一次;多个{{$slot}}会导致内容重复或错位
性能差异几乎可以忽略
两者最终都编译成原生 PHP。Slot 多一层组件解析,但 Laravel 10+ 已优化到微秒级;@include 看似直白,但频繁 include 同一文件仍会触发多次文件 I/O —— 尤其在开发模式下未启用 OPcache 时。
真正影响效率的是人:Slot 让多人协作时更容易理解「这块该填什么」,@include 则容易变成“谁也不知道这个 partial 还依赖哪些变量”。

















