Komponenter
En Blade komponent är som en vanlig Blade vy som kan användas som en HTML-tagg. Du har kontroll över attributen som komponenten ska ta emot.
En komponent kan se ut så här:
<x-example-component title="Example Component" :image-id="$image"/><x-example-component title="Example Component" :image-id="$image"/>Det finns två olika typer av komponenter: klass-baserade komponenter och anonyma komponenter.
Skapa en klass-baserad komponent
En klass-baserad komponent består av minst en klass som ligger i app/View/Components mappen, men har oftast en associerad vy i resources/views/components mappen.
Det enklaste sättet att skapa en klass-baserad komponent är med följande kommando:
wp dusk make:component Buttonwp dusk make:component ButtonI detta exempel skapas filerna app/View/Components/Button.php och resources/views/components/button.blade.php.
Skapa en anonym komponent
För att skapa en anonym komponent behövs bara en Blade fil i resources/view/components mappen.
Användning
Komponenten används som en vanlig HTML-tagg, men börjar alltid med x.
Argument och attribut
I en klass-baserad komponent kommer attributen först in som parametrar i konstruktorn. De måste sedan sedan manuellt definieras som attribut hos klassen för att bli tillgängliga i den tillhörande Blade-vyn.
// ...
public function __construct(string $message = '')
{
$this->message = $message;
}
// ...// ...
public function __construct(string $message = '')
{
$this->message = $message;
}
// ...{{-- resources/views/my-template.blade.php --}}
<x-alert message="Something happened!" />{{-- resources/views/my-template.blade.php --}}
<x-alert message="Something happened!" />Anonyma komponenter kan ta emot parametrar med hjälp av @props direktivet. Attributet blir på så sätt definierad som en variabel i vyn.
Attribut som inte har definieras hamnar i variabeln $attributes.
{{-- resources/views/some-file.blade.php --}}
<x-button useful="yes" helpful="no" />
{{-- resources/views/components/button.blade.php --}}
@props(['useful', 'useless' => null])
<button {{ $attributes }}>
{{ $useful }} {{-- 'yes' --}}
{{ $useless }} {{-- null --}}
</button>
{{ $attributes }} {{-- ['helpful'=>'no"] --}}{{-- resources/views/some-file.blade.php --}}
<x-button useful="yes" helpful="no" />
{{-- resources/views/components/button.blade.php --}}
@props(['useful', 'useless' => null])
<button {{ $attributes }}>
{{ $useful }} {{-- 'yes' --}}
{{ $useless }} {{-- null --}}
</button>
{{ $attributes }} {{-- ['helpful'=>'no"] --}}I exemplet ovan är useless ett valfritt argument och definieras som null om inget skickas med.
Slå samman attribut
Det går att slå samman attribut med metoden $attributes->merge(['defaults'=> 'example']).
<div {{ $attributes->merge(['id' => 'alert-' . $uuid]) }}>
{{ $message }}
</div><div {{ $attributes->merge(['id' => 'alert-' . $uuid]) }}>
{{ $message }}
</div>I exemplet ovan slås alla skickade attribut samman med id.
Övriga metoder för $attributes
->class('hidden')- slår samman skickade css-klasser med angiven sträng->class(['text-pink-200', 'hidden' => !$visible])- den accepterar även en array där den endast tar med nycklar vars värden ärtrue.
->filter(fn ($value, $key) => $key === 'src')- filtrera på skickade attribut->whereStartsWith('data')- filtrera på attribut-namn som börjar med angiven sträng->whereDoesntStartWith('data')- filtrera på attribut-namn som inte börjar med angiven sträng->first()- returnerar första attribut-värdet->has('message')- returnerartrueom attributet är skickat->only('message')- returnerar endast angivet attribut->get('message')- returnerar endast angivet attribut-värde
Attribut som PHP
För att slippa använda echo syntaxen finns det en short hand för att evaluera komponent-attributen som php. Då används : framför attributet namn. Exempelvis:
<x-button :type="$button_type" /><x-button :type="$button_type" />Detta fungerar endast på komponenter.
Slots
Allt som komponenten omsluter hamnar i variabeln $slot. Det går även att ha namngivna slots. Se följande exempel:
{{-- resources/views/components/button.blade.php --}}
<button>
<span class="some-icon">$icon</span>
{{ $slot }}
</button>
{{-- resources/views/my-template.blade.php --}}
<x-button>
<x-slot name="icon">💥</x-slot>
Don't press
</x-button>{{-- resources/views/components/button.blade.php --}}
<button>
<span class="some-icon">$icon</span>
{{ $slot }}
</button>
{{-- resources/views/my-template.blade.php --}}
<x-button>
<x-slot name="icon">💥</x-slot>
Don't press
</x-button>