$attributes->merge : 我做错了什么

$attributes->merge : what am i doing wrong

我在 laravel 中有以下 blade 组件。我正在使用顺风。位于 views/components/indigo-button-sm.blade.php

<button {{ $attributes->merge(['type' => 'button', 'class' => 'inline-flex justify-center py-1 px-1 border border-transparent shadow-sm text-sm font-medium rounded-md text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500']) }}>
    {{ $slot }}
</button>

我希望能够即时更改组件。也就是说,我使用上面的组件来显示一个“保存”按钮。但随后我想显示一个按钮,上面写着“确认”您的输入,并稍微更改按钮的外观,以在视觉上暗示这是一个不同的选择。

具体来说,我有一个自动完成功能,用户正在输入我提供超过 2,000 个选择(学校)的项目。但是如果用户输入的学校不在我的数据库 table 列表中,我希望他们确认他们输入的学校是正确的,所以我想显示“确认”你的输入按钮,只是为了当然。如果他们选择的学校已经在列表中,我不会要求他们确认输入。

所以,我想更改保存按钮

bg-indigo-600 hover:bg-indigo-700

确认按钮颜色方案略有不同。

bg-indigo-800 hover:bg-indigo-900

<x-indigo-button-sm x-show="showsaveschool" wire:click="saveSchoolInfo">Save</x-indigo-button-sm>
<x-indigo-button-sm x-show="showconfirmschool" wire:click="confirmSaveSchoolInfo">Confirm</x-indigo-button-sm>

所以他们输入学校,但学校不在查找列表中。他们单击“保存”按钮。保存按钮消失,确认按钮显示,确认按钮下方会出现一段文字。

当我输入这个时,我开始认为只创建一个确认按钮并始终使用它会更好。

无论如何。我认为 $attributes(merge['']) 将允许您更改属性,但我认为它只允许您添加属性。因此,如果您有边距 class,在组件中说“my-0”,它似乎不允许新的类似 class,例如“my-5”

我们将不胜感激您的意见。

对于 class 属性,您可以使用 conditional merging 来确保仅在未设置冲突属性时才插入该属性。

<button
    {{ $attributes->merge([
        'type' => 'button',
        'class' => [
            'inline-flex justify-center py-1 px-1',
            'border border-transparent shadow-sm',
            'text-sm font-medium rounded-md text-white',
            'focus:outline-none focus:ring-2',
            'focus:ring-offset-2 focus:ring-indigo-500'
            'bg-indigo-600 hover:bg-indigo-700' => hasCustomBackground(),
        ]
    )}}
>
    {{ $slot }}
</button>

在 blade 模板中,如果布尔值为真,则插入 non-numeric 数组键。所以在这种情况下,根据传递的 class 值创建一个 hasCustomBackground() component method

class IndigoButtonSm extends Component
{
    public string class;

    public function hasCustomBackground(): bool
    {
        $classes = collect(explode(" ", $this->class));
        return $classes->contains(fn ($c) => str_contains("bg-indigo", $c));
    }

    ...
}

我以前从未使用过此功能,但根据文档,它应该有效吗?