@yield('title', 'My App')
@yield('style')
@yield('content')
@yield('script')
@yield('title', 'My App')
@yield('style')
@yield('content')
@yield('script')
闭合前,确保 DOM 已就绪,且脚本按子视图声明顺序执行(Laravel 默认累积追加)。 2. 创建可复用的组件视图(如 div1.blade.php)
{{-- resources/views/components/div1.blade.php --}}
@extend('layouts.app')
@section('content')
Component 1
@endsection
@section('script')
@endsection同理,div2.blade.php 和 div3.blade.php 各自 @extend('layouts.app') 并独立定义 @section('content') 与 @section('script')。 3. 主页面 main.blade.php —— 不再使用 @include,而是直接作为「组合页」
{{-- resources/views/main.blade.php --}}
@extend('layouts.app')
@section('title', 'Dashboard')
@section('content')
Dashboard
{{-- 直接渲染各组件视图(它们已继承同一布局) --}}
@include('components.div1')
@include('components.div2')
@include('components.div3')
{{-- 或更推荐:用 @each 或自定义组件封装逻辑 --}}
@endsection
@section('script')
{{-- 公共脚本(如全局工具函数、第三方库初始化)放在这里 --}}
@endsection
? 关键点:@include('components.div1') 在此上下文中
仍会触发 div1.blade.php 中的 @section('script')
,因为 div1.blade.php 本身是 @extend('layouts.app'),其 @section('script') 会被 Laravel 视为对父布局 @yield('script') 的填充内容——而 main.blade.php 作为当前渲染上下文,也参与了该 section 的累积过程。
✅ 运行效果与优势
最终 HTML 中,
各组件脚本完全解耦:修改 div2.blade.php 的 JS 不影响 div1 的行为;
支持按需加载:可结合 Laravel Mix + @vite 或动态 import() 实现懒加载;
兼容 SEO 与 SSR:服务端直出完整 HTML + 脚本,无 hydration 冲突。
⚠️ 注意事项
❌ 不要混用 @include 和 @section 在非继承模板中——@include 是纯内容插入,不参与 section 生命周期;
✅ 若必须用 @include(如局部片段),请改用 @push('scripts') + @stack('scripts') 替代 @section(更灵活且支持多次追加);
? 对于高频复用组件,建议升级为
Blade Components
(相关文章