変数をコンポーネントからスロットに渡すことは可能ですか?次に例を示します。
{{-- index.blade.php --}}
@component('slider', ['entities' => [0, 1, 2]])
@slot('title')
Slider title
@endslot
@slot('slide')
Slider content no {{ $entity }}
@endslot
@endcomponent
{{-- slider.blade.php --}}
<h1>{{ $title }}</h1>
<ul>
@foreach($entities as $entity)
<li>{{ $slide }}</li>
@endforeach
</ul>
現在の結果:
例外:$ entityが定義されていません
期待される結果:
<h1>Slider title</h1>
<ul>
<li>Slider content no 0</li>
<li>Slider content no 1</li>
<li>Slider content no 2</li>
</ul>
コンポーネントからスロットコンテキストにデータを渡す方法がないようです。 @section
/@yield
も同様です。
私が発見したのは@each
関数です。 https://laravel.com/docs/5.6/blade#rendering-views-for-collections
リストアイテムのコンテンツに別のビューパーシャルが必要です(ここではitem
と呼びます)。
{{-- index.blade.php --}}
@component('slider', ['entities' => [0, 1, 2], 'item_view' => 'item'])
@slot('title')
Slider title
@endslot
@endcomponent
{{-- item.blade.php --}}
<li>
Slider content no $entity
</li>
{{-- slider.blade.php --}}
<h1>{{ $title }}</h1>
<ul>
@each($item_view, $entities, 'entity')
</ul>
例:異なる内容の新しいスライダーを作る:
{{-- gallery.blade.php --}}
@component('slider', ['entities' => ['a.png', 'b.png', 'c.png'], 'item_view' => 'gallery_item'])
@slot('title')
Gallery
@endslot
@endcomponent
{{-- gallery_item.blade.php --}}
<li>
<img src={{ $entity }} />
</li>
UPDATE:スコープスロット機能をブレードに追加するパッケージを作成しました。あなたの問題はスコープスロットの完全なユースケースであり、それらを使用して簡単に解決できます。 チェックアウト 。
私は同じ問題に苦しみ、最後にコンポーネントからスロットに変数を「渡す」方法を見つけました。秘訣は @verbatim
ブレードコードをコンパイルしないようにするディレクティブ。したがって、ブレードのコードをスロットに渡し、コンポーネントでコンパイルすることができます。ただし、条件は1つだけです。foreach
ループで使用される変数の名前は、スロットで使用されるものと同じである必要があります。 (以下の例に示すように、slide
スロットは$entity
変数、コンポーネントのforeach
ループもそうです)
index.blade.php
@component('slider', ['entities' => [0, 1, 2]])
@slot('title')
Slider title
@endslot
@slot('slide')
@verbatim
Slide {{ $entity }}
@if ($entity === 0) {{-- Directives also work! --}}
<strong>Special slide</strong>
@endif
@endverbatim
@endslot
@endcomponent
slider.blade.php
<h1>{{ $title }}</h1>
<ul>
@foreach($entities as $entity)
<li>{!! eval('?>'.Blade::compileString($slide)) !!}</li>
@endforeach
</ul>
これは問題に対する少し「ハッキー」な解決策ですが、最も重要なことは、以下のスクリーンショットでわかるように、それが仕事をすることです。
別の方法で試すことができます。ここでは、私が実行した方法。
{{-- index.blade.php --}}
@component('slider', ['entities' => [0, 1, 2]])
@slot('title')
Slider title
@endslot
@slot('slide')
Slider content no
@endslot
@endcomponent
{{-- slider.blade.php --}}
<h1>{{ $title }}</h1>
<ul>
@foreach($entities as $entity)
<li>{{ $slide }} {{ $entity }}</li>
@endforeach
</ul>