Показывать дополнительную строку при нажатии кнопки livewire

Компонент Livewire не отображается при изменении переменной

У меня есть этот компонент Livewire:

<?php
    
namespace Modules\Contracts\Http\Livewire\Settlements;
    
use Carbon\Carbon;
use Livewire\Component;
use Modules\Contracts\Entities\Settlement;
    
class ReportBasicRow extends Component {
    public Settlement $settlement;
    public bool       $show_more  = false;
    
    /**
     * Monta el componente
     *
     * @param Settlement $settlement
     */
    public function mount( Settlement $settlement )
    {
        $this->settlement = $settlement;
    }
    
    /**
     * Cambia el estado de la variable $show_more
     */
    public function toggleShowMore()
    {
        $this->show_more = !$this->show_more;
    }
    
    /**
     * Muestra el componente
     *
     * @return \Illuminate\Contracts\View\View
     */
    public function render()
    {
        return view( 'contracts::livewire.settlements.reports.basic-row' );
    }
}

Вид компонента такой:

    <tr>
        <td class = "text-center align-middle">{{ $settlement->contract->getNumber() }}</td>
        <td class = "text-center align-middle" data-toggle = "tooltip" data-placement = "top" title = "@if ( $settlement->is_completed ) {{ __( 'contracts::settlements.completed' ) }} @else {{ __( 'contracts::settlements.pending' ) }} @endif">
            <span class = "fa-stack">
                @if ( $settlement->is_completed )
                    <i class = "fas fa-check-circle fa-2x text-green"></i>
                @else
                    <i class = "fas fa-circle text-secondary fa-stack-2x"></i>
                    <i class = "fas fa-spinner text-white fa-spin"></i>
                @endif
            </span>
        </td>
        <td class = "text-center align-middle">
            @if ( $settlement->is_completed  )
                {{ $settlement->created_at->diffInHours( $settlement->updated_at ) }} {{ __( 'hours' ) }}
            @else
                {{ $settlement->created_at->diffInHours( now() ) }} {{ __( 'hours' ) }}
            @endif
        </td>
        <td class = "align-middle">
            <button type = "button" wire:click = "toggleShowMore" class = "btn btn-link text-info">
                @if ( $show_more == false )
                    <i class = "far fa-plus-square"></i>
                @else
                    <i class = "far fa-minus-square"></i>
                @endif
            </button>
        </td>
    </tr>
    <tr class = "@if ( $show_more == false ) d-none @endif">
        <td class = "" colspan = "4">
            <ul class = "list-group list-group-flush">
                @foreach( $settlement->getPending() as $pending_dependency )
                    <li class = "list-group-item">{{ $pending_dependency->name }}</li>
                @endforeach
                @if ( $settlement->supervisor_at == null )
                    <li class = "list-group-item">{{ ucfirst( __( 'contracts::contracts.supervisor' ) ) }}</li>
                @endif
            </ul>
        </td>
    </tr>

Я хочу показывать второй TR только тогда, когда люди нажимают кнопку плюс, но это не работает. Если я оставлю видимым TR, он покажет правильную информацию. Я не уверен, должен ли я добавить код для принудительного рендеринга после клика.

Я также знаю, что содержимое должно быть заключено в один элемент, но я не знаю, как это сделать только с одной строкой таблицы, так как я хочу показать ожидающие области ниже.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
1 000
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы пробовали использовать alpine в своем компоненте? Нет необходимости в свойстве $showMore в классе livewire.

<tbody x-data = "{showMore: false}">
    <tr>
        ....
        <td class = "align-middle">
            <button type = "button" x-on:click = "showMore = !showMore" class = "btn btn-link text-info">
                <i class = "far" x-bind:class = "{'fa-plus-square': !showMore, 'fa-minus-square': showMore}"></i>
            </button>
        </td>
    </tr>
    <tr x-show = "showMore">
        ...
    </tr>
</tbody>
Ответ принят как подходящий

Я протестировал блейд-версию решения.

@if ( $show_more )
<tr>
    <td class = "" colspan = "4">
        <ul class = "list-group list-group-flush">
            more..
        </ul>
    </td>
</tr>
@endif

Обертка означает поместить все внутри вида лезвия в <div></div> как <div><tr><td class..> ..</div>. Как и в Vuejs2.

Спасибо.

Другие вопросы по теме