Есть ли в Laravel Livewire функция, которая позволяет передавать свойство value html-элемента в функцию?

#laravel-8 #laravel-livewire

Вопрос:

Есть ли в Laravel Livewire функция, которая позволяет передавать свойство value html-элемента (будь то переключатель, флажок, выпадающий список или текстовое поле) в функцию?

Например: у меня на странице есть список. Этот список состоит из различных приготовленных блюд. Я выбираю блюдо из списка, нажав на него, и значение передается. Может ли это значение быть передано в функцию?

Контроллер LiveWire

     
    <?php
    
    namespace AppHttpLivewire;
    
    use LivewireComponent;
    
    class Dishes extends Component
    {
    
        public function showRecipe($value)
        {
            //query database or some conditional logic
        }
    
    
        public function render()
        {
    
                return view('livewire.dishes')
    
        }
    
    }

 

Компонент LiveWire

     <div>
    <ul>
        <li value="pizza" wire:click="showRecipe(this.value)">Pizza</li>
        <li value="cherry_pie" wire:click="showRecipe(this.value)">Cherry Pie</li>
        <li value="beef_stronganoff" wire:click="showRecipe(this.value)">Beef Stroganoff</li>
        <li value="caesar_salad" wire:click="showRecipe(this.value)">Caesar Salad</li>
        <li value="lobster_newburg" wire:click="showRecipe(this.value)">Lobster Newburg</li>
    </ul>
    </div>
 

Ответ №1:

value не является допустимым атрибутом <li> тега. Однако вы можете поставить метку привязки с действием «запретить по умолчанию» или просто сохранить wire:click li ее и передать данные непосредственно методу.

 <div>
    <ul>
        <li wire:click="showRecipe('pizza')">Pizza</li>
        <li wire:click="showRecipe('cherry_pie')">Cherry Pie</li>
        <li wire:click="showRecipe('beef_stronganoff')">Beef Stroganoff</li>
        <li wire:click="showRecipe('caesar_salad')">Caesar Salad</li>
        <li wire:click="showRecipe('lobster_newburg')">Lobster Newburg</li>
    </ul>
</div>
 

Если вы создаете это в цикле с помощью PHP/blade, вам следует использовать wire:key его. Ключ должен быть чем-то уникальным, чтобы Livewire мог отслеживать каждую отдельную запись.

 <div>
    <ul>
        @foreach([
            'pizza' => 'Pizza',
            'cherry_pie' => 'Cherry Pie',
            'beef_stronganoff' => 'Beef Stroganoff',
            'caesar_salad' => 'Caesar Salad',
            'lobster_newburg' => 'Lobster Newburg',
        ] as $value=>$name)
            <li wire:key="dish-{{ $loop->index }}" wire:click="showRecipe('{{ $value }}')">{{ $name }}</li>
        @endforeach
    </ul>
</div>