web-dev-qa-db-ja.com

変数をコンポーネントからスロットに渡す

変数をコンポーネントからスロットに渡すことは可能ですか?次に例を示します。

{{-- 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>
  • $ entity変数をスライドスロットに渡すにはどうすればよいですか?
  • そうすることは可能ですか?
  • そうでない場合、代替手段はありますか?
9
HubertNNN

コンポーネントからスロットコンテキストにデータを渡す方法がないようです。 @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>
2
Kalabasa

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>

これは問題に対する少し「ハッキー」な解決策ですが、最も重要なことは、以下のスクリーンショットでわかるように、それが仕事をすることです。

The result of the code above

0
Konrad Kalemba

別の方法で試すことができます。ここでは、私が実行した方法。

{{-- 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>
0