拉拉维尔之刃 - @slot/@component与@include的优势?

2022-08-30 09:59:07

Laravel 5.4 Blade引入了组件和插槽的概念 - 但我看不出它们在传统@include上增加了什么。据我所知,使用组件/插槽,您可以执行以下操作:

在 template component-tpl.blade 中.php:

<div class='container'>
  <h1>{{$slot1}}</h1>
  <h2>{{$slot2}}</h2>
</div>

使用页面模板中的插槽,您可以执行以下操作:

@component('component-tpl')
  @slot('slot1')
    The content of Slot 1
  @endslot
  @slot('slot2')
    The content of Slot 2
  @endslot
@endcomponent

与旧的相比,它提供了哪些功能:

@include('component-tpl',['slot1'=>'The content of Slot 1',
'slot2'=>"The content of Slot 2"])

使用完全相同的“component-tpl.blade.php”Blade 模板?

我错过了什么?感谢您的任何见解。

克里斯


答案 1

如前所述,没有功能差异我错了 - 请参阅benjaminhull的答案,了解有关变量范围和传递叶片语法代码的详细信息。但是,以下内容仍然适用于基本用法。

如果插槽可能包含 HTML,则使用组件将在刀片式服务器文件中提供更清晰的语法。

@component('test')
   <strong>This text has html</strong>
@endcomponent

@include('test', ['slot' => '<strong>This text has HTML</strong>'])

同样,如果组件没有插槽,则可能首选包含:

@include('test')

@component('test')
@endcomponent

答案 2

我想我已经找到了另一个关键的区别。例如,从 5.4 的文档:

Blade 的 @include 指令允许您从另一个视图中包含 Blade 视图。父视图可用的所有变量都将提供给包含的视图:

据我所知,组件的作用域与包含视图的作用域不同,因此可用于父视图的变量在组件中不可用。您需要将变量传递给组件,如下所示:

@component('alert', ['foo' => 'bar'])
@endcomponent

此讨论与此问题相关:在 Markdown Mailables 中使用变量


推荐