Laravel/Livewire/x-components 如何传递一个数组?
Laravel/Livewire/x-components how to pass an array?
我有一个解决办法,但我觉得它很可怕,所以我想问你是否有更好(或正确)的方法
我需要创建一个 <select>
,我将在我的应用程序周围的很多地方使用它。这个 <select>
就是你所期望的:
<select name="xxx">
<option value="">...</option>
@foreach ($equipos as $equipo)
<option value="{{ $equipo->id }}">
{{ $equipo->equipo }}
</option>
@endforeach
</select>
第一次尝试
所以,我的第一次尝试是使用组件 <x-select-equipos>
组件视图将是:
<select {{ $attributes->merge(['class' => 'w-full']) }}>
<option value="">...</option>
@foreach ($equipos as $equipo)
<option value="{{ $equipo->id }}">
{{ $equipo->equipo }}
</option>
@endforeach
</select>
所以我想我可以这样调用这个组件:
<x-select-equipos name="xxx" equipos="{{ $equipos }}" />
但是我无法将 $equipos
集合传递给组件。如果我这样做,它只会发送 true
第二次尝试
在第二次尝试中,我写了一个 Livewire 组件,但它限制了我使用 Laravel 的 ORM,所以我“渲染”了组件中的所有 <option>
s (.php), 并将它们显示在 .blade.php
这个解决方案的另一个问题是,每次我必须显示 <select>
时我都必须调用数据库,这是次优的(更多内容见下文)
我的“解决方案”
我有点不喜欢它,但它确实有效,我创建了一个 <x-component>
比如:
<div>
@php
use App\Models\Equipo;
$equipos = Equipo::orderBy('nombre')->get();
@endphp
<select {{ $attributes->merge(['class' => 'w-full']) }}>
<option value="">...</option>
@foreach ($equipos as $equipo)
<option value="{{ $equipo->id }}">
{{ $equipo->nombre }}
</option>
@endforeach
</select>
</div>
这个解决方案有很多我不喜欢的地方,其中之一是每次它必须呈现 <option>
时都必须转到数据库,我必须加载一个屏幕30 selects
左右。虽然记录的数量很少(大约40条),但我还是不喜欢它,因为我觉得它效率很低。
其他可能的解决方案是回到 Laravel/PHP 使用“部分”或 @include
的基础知识,这会很好地工作,因为它只会进入数据库一次,事实上我在以前的版本中就是这样做的,我想尝试新的方法,使用 <x-components>
或 LiveWire
我完全确定一定有更好的方法。
But I can't pass the $equipos collection to the component. If I do that this way, it just sends a true
$equipos
不是 eloquent 合集吗?您应该能够将集合传递给您的组件。
如何传递一个集合,以及指定模型上要用于值和标签的字段的道具?
@props([
'items', 'value', 'label'
])
<select>
<option value="">{{ __('Please select an option ...') }}</option>
@foreach ($items as $item)
<option value="{{ $item->$value }}">{{ $item->$label }}</option>
@endforeach
</select>
那么你应该可以调用你的组件如下(例如):
<x-select :items="User::all()" value="id" label="email" />
我有一个解决办法,但我觉得它很可怕,所以我想问你是否有更好(或正确)的方法
我需要创建一个 <select>
,我将在我的应用程序周围的很多地方使用它。这个 <select>
就是你所期望的:
<select name="xxx">
<option value="">...</option>
@foreach ($equipos as $equipo)
<option value="{{ $equipo->id }}">
{{ $equipo->equipo }}
</option>
@endforeach
</select>
第一次尝试
所以,我的第一次尝试是使用组件 <x-select-equipos>
组件视图将是:
<select {{ $attributes->merge(['class' => 'w-full']) }}>
<option value="">...</option>
@foreach ($equipos as $equipo)
<option value="{{ $equipo->id }}">
{{ $equipo->equipo }}
</option>
@endforeach
</select>
所以我想我可以这样调用这个组件:
<x-select-equipos name="xxx" equipos="{{ $equipos }}" />
但是我无法将 $equipos
集合传递给组件。如果我这样做,它只会发送 true
第二次尝试
在第二次尝试中,我写了一个 Livewire 组件,但它限制了我使用 Laravel 的 ORM,所以我“渲染”了组件中的所有 <option>
s (.php), 并将它们显示在 .blade.php
这个解决方案的另一个问题是,每次我必须显示 <select>
时我都必须调用数据库,这是次优的(更多内容见下文)
我的“解决方案”
我有点不喜欢它,但它确实有效,我创建了一个 <x-component>
比如:
<div>
@php
use App\Models\Equipo;
$equipos = Equipo::orderBy('nombre')->get();
@endphp
<select {{ $attributes->merge(['class' => 'w-full']) }}>
<option value="">...</option>
@foreach ($equipos as $equipo)
<option value="{{ $equipo->id }}">
{{ $equipo->nombre }}
</option>
@endforeach
</select>
</div>
这个解决方案有很多我不喜欢的地方,其中之一是每次它必须呈现 <option>
时都必须转到数据库,我必须加载一个屏幕30 selects
左右。虽然记录的数量很少(大约40条),但我还是不喜欢它,因为我觉得它效率很低。
其他可能的解决方案是回到 Laravel/PHP 使用“部分”或 @include
的基础知识,这会很好地工作,因为它只会进入数据库一次,事实上我在以前的版本中就是这样做的,我想尝试新的方法,使用 <x-components>
或 LiveWire
我完全确定一定有更好的方法。
But I can't pass the $equipos collection to the component. If I do that this way, it just sends a true
$equipos
不是 eloquent 合集吗?您应该能够将集合传递给您的组件。
如何传递一个集合,以及指定模型上要用于值和标签的字段的道具?
@props([
'items', 'value', 'label'
])
<select>
<option value="">{{ __('Please select an option ...') }}</option>
@foreach ($items as $item)
<option value="{{ $item->$value }}">{{ $item->$label }}</option>
@endforeach
</select>
那么你应该可以调用你的组件如下(例如):
<x-select :items="User::all()" value="id" label="email" />