Наличие события onClick и провода: щелкните под тем же элементом

У меня есть ссылка href на событие onclick и событие wire:click. Событие onclick вызывает функцию слайдера внутри javascript. При нажатии ползунок должен подняться с правой стороны с некоторыми данными, а wire:click = "getOrder({{$orderId}})" должен получить заказ. Оба работают, но ползунок сдвигается назад при получении заказа с сервера. Если я уберу wire:click, ползунок останется, но я не смогу получить заказ. Вот мой код слайдера:

<div> 
<div id = "slideover-container" class = "fixed inset-0 w-full h-full invisible z-50">
    <div onclick = "toggleSlideover()" id = "slideover-bg" class = "absolute duration-500 ease-out transition-all inset-0 w-full h-full bg-gray-900 opacity-0"></div>
    <div id = "slideover" class = "absolute w-3/4 duration-500 ease-out transition-all h-full bg-white right-0 top-0 translate-x-full">
        <div onclick = "toggleSlideover()" class = "w-10 h-10 flex items-center shadow-sm rounded-full justify-center hover:bg-gray-200 cursor-pointer absolute top-0 right-0 m-2">
            <svg xmlns = "http://www.w3.org/2000/svg" fill = "none" viewBox = "0 0 24 24" stroke-width = "1.5" stroke = "currentColor" class = "w-6 h-6">
                <path stroke-linecap = "round" stroke-linejoin = "round" d = "M6 18 18 6M6 6l12 12" />
            </svg>
        </div>
        <div class = "p-4 relative mt-20">
            
            <input type = "hidden" id = "{{$orderId}}">
            <table x-ref = "table" class = "w-full text-sm text-left rtl:text-right dark:text-gray-400">
                <thead class = "text-xs text-gray-700 uppercase bg-gray-50 dark:bg-gray-700 dark:text-gray-400">
                    <tr>
                        <th scope = "col" class = "px-3 py-3">Amount</th>
                        <th scope = "col" class = "px-3 py-3">Ref #</th>
                        <th scope = "col" class = "px-3 py-3">Payment</th>
                        <th scope = "col" class = "px-3 py-3">Date</th>
                        <th scope = "col" class = "px-3 py-3">Action</th>
                    </tr>
                </head>
                <tbody>
                    <tr class = "odd:bg-white hover:bg-gray-50 odd:dark:bg-gray-900 even:bg-gray-50 even:dark:bg-gray-800 border-b dark:border-gray-700">
                        <td class = "px-3 py-2"></td>
                        <td class = "px-3 py-2"></td>
                        <td class = "px-3 py-2"></td>
                        <td class = "px-3 py-2 text-center"></td>
                        <td class = "px-3 py-2 text-center">
                            <button type = "button" class = "rounded-full hover:bg-red-600 bg-red-500 p-2 text-white">
                            <svg xmlns = "http://www.w3.org/2000/svg" fill = "none" viewBox = "0 0 24 24" stroke-width = "1.5" stroke = "currentColor" class = "w-6 h-6">
                                <path stroke-linecap = "round" stroke-linejoin = "round" d = "m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0" />
                                </svg>
                            </button>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>
</div>
<script> 

function toggleSlideover(id) {
    
        document.getElementById('slideover-container').classList.toggle('invisible')
        document.getElementById('slideover-bg').classList.toggle('opacity-0')
        document.getElementById('slideover-bg').classList.toggle('opacity-50')
        document.getElementById('slideover').classList.toggle('translate-x-full')
}
and this is the link I call the slider:
<a href = "#" onclick = "toggleSlideover()"  wire:click = "getOrder({{$id}})" class = "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white btn_payments">Payments</a>

Хочу отметить, что эти ссылки есть в каждой строке таблицы. Кто-нибудь знает, как решить мою дилемму? Я потратил несколько дней, чтобы заставить это работать, и что бы я ни делал, я всегда получаю одни и те же результаты. Может быть, я смогу сделать это с помощью Alpine? Мне нужно лучше разбираться в Livewire и Alpine.

Стоит ли изучать 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-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы устанавливаете это с помощью простого JavaScript, Livewire не будет знать и отслеживать состояние вашего HTML, измененного JavaScript. Здесь у вас есть два варианта,

  1. Добавьте wire:ignore к слайдеру, чтобы Livewire ничего не перезаписывал на этапе сравнения DOM.
  2. Используйте Alpine.js для установки состояния. Поскольку именно на этом построен Livewire, он способен определять состояние и сохранять его между запросами.

Вариант 1 — просто добавить wire:ignore или wire:ignore.self к вашим HTML-элементам, что не позволит Livewire различать эти элементы. Это будет иметь и другие последствия, поэтому я рекомендую вариант 2 с использованием Alpine.js.

Вариант 2 использует одно событие щелчка для запуска вызова Livewire и отправляет событие, открывающее слайдер.

<a href = "#" x-on:click: = "$wire.getOrder({{ $id }}); $dispatch('open-slideover');" class = "block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 dark:hover:bg-gray-600 dark:text-gray-200 dark:hover:text-white btn_payments">Payments</a>

Затем на слайде используйте x-data, чтобы отслеживать состояние.

<div 
    id = "slideover-container" 
    class = "fixed inset-0 w-full h-full invisible z-50"
    x-data = "{ open: false }"
    x-on:open-slideover.window = "open = true"
    x-bind:class = "{ 'invisible': !open }"
>
    <div 
        onclick = "toggleSlideover()" 
        id = "slideover-bg" 
        class = "absolute duration-500 ease-out transition-all inset-0 w-full h-full bg-gray-900 opacity-0"
        x-bind:class = "{ 'opacity-50': open, 'opacity-0': !open' }"
    ></div>
    <div 
        id = "slideover" 
        class = "absolute w-3/4 duration-500 ease-out transition-all h-full bg-white right-0 top-0"
        x-bind:class = "{ 'translate-x-0': open, 'translate-x-full': !open' }"
    >

Я не смог воспроизвести вариант 2, поскольку он не работал. Что-то не так с кодом или чего-то не хватает в вашем HTML. Тем не менее, я установил Wire:ignore.self для слайдов-контейнера, слайдов-bg и слайдов, и он начал работать как положено. Спасибо. Кирель.

Edward B. 02.04.2024 16:52

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