Est-il possible de passer une variable du composant dans un slot. Voici un exemple:
{{-- 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>
Résultat actuel:
Exception: l'entité $ n'est pas définie
Résultat attendu:
<h1>Slider title</h1>
<ul>
<li>Slider content no 0</li>
<li>Slider content no 1</li>
<li>Slider content no 2</li>
</ul>
Il semble qu'il n'y ait aucun moyen de transmettre des données d'un composant à un contexte d'emplacement. C'est également le cas avec @section
/@yield
.
Ce que j'ai découvert, c'est le @each
fonction. https://laravel.com/docs/5.6/blade#rendering-views-for-collections
Vous devez avoir une autre vue partielle pour le contenu de l'élément de liste (appelée item
ici).
{{-- 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>
Exemple: création d'un nouveau curseur avec un contenu différent:
{{-- 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>
MISE À JOUR: J'ai créé un package ajoutant une fonctionnalité de portées étendues à Blade. Votre problème est un cas d'utilisation parfait pour les emplacements délimités et il peut être facilement résolu en les utilisant. Vérifiez-le .
J'ai eu du mal avec le même problème et j'ai finalement trouvé un moyen de "passer" des variables du composant au slot. L'astuce consiste à utiliser @verbatim
directive qui rend le code de lame non compilable. Par conséquent, nous pouvons passer du code de lame à un emplacement, puis le compiler dans notre composant. Cependant, il n'y a qu'une seule condition - le nom de la variable utilisée dans la boucle foreach
doit être le même que celui utilisé dans le slot. (Comme illustré dans l'exemple ci-dessous - l'emplacement slide
utilise $entity
variable ainsi que la boucle foreach
dans le composant)
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>
C'est une petite solution "hacky" au problème, mais surtout, il fait le travail comme vous pouvez le voir sur la capture d'écran ci-dessous.
Nous pouvons essayer de différentes manières. Ici, comment j'ai exécuté.
{{-- 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>