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

Rob*_*vis 3 laravel laravel-blade laravel-components

我在 laravel 中有以下刀片组件。我正在使用顺风。位于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>
Run Code Online (Sandbox Code Playgroud)

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

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

所以,我想更改保存按钮

bg-indigo-600 hover:bg-indigo-700
Run Code Online (Sandbox Code Playgroud)

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

bg-indigo-800 hover:bg-indigo-900
Run Code Online (Sandbox Code Playgroud)

或者

<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>
Run Code Online (Sandbox Code Playgroud)

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

当我输入此内容时,我开始认为创建一个“确认”按钮并始终使用它会更好。

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

我们将不胜感激您的评论。

mik*_*n32 6

对于class属性,您可以使用条件合并来确保仅在尚未设置冲突的属性时插入该属性。该class()方法传递一个数组。如果数组条目具有数字索引,则该值始终合并到class属性中。但是,如果条目具有非数字索引,则如果值为true,则该索引将合并到属性中。class

<button
    {{ $attributes->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(),
       ])
       ->merge([
          'type' => 'button',
       ])
    }}
>
    {{ $slot }}
</button>
Run Code Online (Sandbox Code Playgroud)

然后,根据传递的类值创建一个hasCustomBackground() 组件方法:

class IndigoButtonSm extends Component
{
    public string class;

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

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