1️⃣
Livewire 3のクイックスタートを拡張してみる 1
前提
背景と目的
- Livewire便利!
- 日本語の情報少ない!
- クイックスタートだけでは味気ない!
という気持ちでクイックスタートのカウンターから機能を拡張してみる。
Livewireの機能を色々使いながら何回かに渡って拡張していけたらなあと思ってます。
環境
- Laravel 11
- Livewire 3
クイックスタート後
のドキュメント通りやると↓のようになる
...うーん。色々と満足できないですね。
今回の拡張後
やったこと
- inputでの直接入力
- カウンターの削除
- 入力の制限
- 配置の調整
- アイコンの利用
手順
tailwindcssの導入
筆者はtailwindcss大好きなので使っていきます
↑を参考に利用できる状態にする
アイコンの導入
「+」と「-」の横幅を統一したいという思いで導入。
等幅フォントを使うのもありだが、日本語対応のものをダウンロードしたりは面倒なのでHeroiconsからsvgで持ってきちゃいます。
bladeコンポーネント作成
ボタンやアイコンは再利用できるようにコンポーネントにしちゃいましょう。
php artisan make:component buttons.button1 --view
実行で resourses/views/components/buttons/button1.blade.php
が作成されるので、
resourses/views/components/buttons/button1.blade.php
<button
{{ $attributes->merge(["class" => "bg-gray-100 hover:bg-gray-200 p-2 shadow border rounded"]) }}
>
{{$slot}}
</button>
こんな感じでボタン用意
php artisan make:component icons.minus --view
実行で resourses/views/components/icons/minus.blade.php
に、Heroiconsからコピーしたsvgを保存。
resourses/views/components/icons/minus.blade.php
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M5 12h14" />
</svg>
同様に以下のアイコンも用意。
- プラスボタン用に
plus.blade.php
- 削除用(カウントが1のとき)に
trash.blade.php
inputフォームで直接入力
<h1>{{ $count }}</h1>
の部分を
<input x-mask="99" wire:model="count"/>
に変更。
x-mask="99"
はAlpine.jsのライブラリから利用。Livewire3インストール時に一緒についてくる。
こちらで2桁の数値までに入力制限をつける。
レイアウト等調整
tailwindcssでレイアウト等を調整し、表示の条件分岐を加えたviewファイルがこちら。
※センタリングはもっと綺麗にかけるかもしれないのだが、筆者のレベルだとこんなもんです。
resources/views/livewire/counter.blade.php
<div class="container mx-auto h-screen place-content-center">
<div class="border p-4 w-64 text-center mx-auto">
@if ($count > 0)
<input x-mask="99" class="text-8xl object-center w-full text-center" wire:model="count"/>
<div class="text-4xl">
<x-buttons.button1 wire:click="decrement">
@if ($count == 1)
<x-icons.trash/>
@else
<x-icons.minus/>
@endif
</x-buttons.button1>
<x-buttons.button1 wire:click="increment">
<x-icons.plus/>
</x-buttons.button1>
</div>
@else
<x-buttons.button1 wire:click="increment">
カウント開始
</x-buttons.button1>
@endif
</div>
</div>
まとめ
思いつくままに拡張してみたらECサイトのカートのようなものが作れそうになってきたので、次回はその方向に進んでみようと思ってます。
Discussion