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" />