web-dev-qa-db-ja.com

Laravel Blade-@ slot / @ component vs @includeの利点?

Laravel 5.4 Bladeはコンポーネントとスロットの概念を導入しましたが、従来の@includeに何が追加されるのかわかりません。私が理解しているように、コンポーネント/スロットを使用すると、次のことができます。

テンプレート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テンプレートを使用していますか?

私は何が欠けていますか?洞察力をありがとう。

クリス

31
ChrisNY

前述のように、機能上の違いはありませんが、両方を慎重に使用すると、ブレードファイルがよりきれいになります。

スロットにHTMLを含めることができる場合、コンポーネントを使用すると、ブレードファイルの構文が簡潔になります。

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

versus

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

同様に、コンポーネントにスロットがない場合、インクルードが優先される場合があります。

@include('test')

versus

@component('test')
@endcomponent
38
Rick

もう1つの重要な違いを突き止めたと思います。たとえば、5.4のドキュメントから:

Bladeの@includeディレクティブを使用すると、別のビュー内からBladeビューを含めることができます。親ビューで使用可能なすべての変数は、含まれるビューで使用可能になります。

私の知る限り、コンポーネントには包含ビューとは異なるスコープがあるため、親ビューで使用できる変数はコンポーネント内では使用できません。次のようなコンポーネントに変数を渡す必要があります。

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

この議論はこの問題に関連しています: Markdown Mailables内の変数を使用

12
DavidHyogo

ドキュメント のように:

コンポーネントとスロットは、セクションとレイアウトに同様の利点を提供します。ただし、コンポーネントやスロットのメンタルモデルを理解しやすいものもあります

4
Denis