Пытаюсь Использовать AlpineJS API Истории Livewire В Качестве SPA. Есть Какие-Нибудь Идеи?

#laravel

Вопрос:

PS: Я очень хорошо понимаю, что это может быть не то, для чего используется AlpineJS (не так, как Vue или React). Я просто хочу поиграть с этим и посмотреть, можно ли чего-нибудь достичь.

Привет всем. Поэтому у меня есть небольшая идея построить СПА-центр с Livewire, AlpineJS и API истории. Как я хочу этого достичь? Чтобы использовать вкладки AlpineJS! Единственная проблема, с которой я столкнулся до сих пор,-это как синхронизировать текущий URL-адрес страницы с x-данными Alpine. См.Коды ниже.

web.php файл

 Route::group(['middleware' => 'auth', 'namespace' => 'AppHttpLivewireApp'], function () {
    Route::get('/', Index::class)->name('index');
    Route::get('/{any}', Index::class);
});
 

Мне пришлось использовать два маршрута к одному и тому же компоненту, иначе я получу ошибку 404. Но, делая это, он прекрасно работает.

Расположение

 <div id="app">
    {{ $slot }}
</div>
 

Все, что у меня есть в моем компоненте layout-spa, — это просто слот $

Index.php Класс

 <?php

namespace AppHttpLivewireApp;

use LivewireComponent;

class Index extends Component
{
    public function render()
    {
        return view('livewire.app.index')->layout('components.layout-spa');
    }
}

 

Затем в моем index.blade.php

 <div x-data="{ page: window.location.hash ? window.location.hash.substring(1) : 'home' }">
    <nav>
        <ul class="navigation capsule-nav">
            <li class="capsule-item" :class="{ 'selected': page === 'home' }">
                <a class="capsule-link" @click.prevent="page = 'home';  window.history.pushState({}, '', '/home')" href="/home">
                    <i class="fas fa-home capsule-link-icon"></i>
                    <span class="capsule-link-text">Home</span>
                </a>
            </li>

            <li class="capsule-item" :class="{ 'selected': page === 'profile' }">
                <a class="capsule-link" @click.prevent="page = 'profile'; window.history.pushState({}, '', '/profile')" href="/profile">
                    <i class="fas fa-user capsule-link-icon"></i>
                    <span class="capsule-link-text">Profile</span>
                </a>
            </li>

            <li class="capsule-item" :class="{ 'selected': page === 'more' }">
                <a class="capsule-link" @click.prevent="page = 'more'; window.location.hash = 'more'" href="#">
                    <i class="fas fa-ellipsis-v capsule-link-icon"></i>
                    <span class="capsule-link-text">More</span>
                </a>
            </li>
        </ul>
    </nav>

    <div>
        <div x-show="page === 'home'" x-transition:enter="animate__animated animate__fadeIn animate__faster">
            @livewire('app.home')
        </div>

        <div x-show="page === 'profile'" x-transition:enter="animate__animated animate__fadeIn animate__faster">
            @livewire('app.profile')
        </div>

        <div x-show="page === 'more'" x-transition:enter="animate__animated animate__fadeIn animate__faster">
            @livewire('app.more')
        </div>
    </div>
</div>
 

Там, наверху, все работает нормально. Нажатие на каждую навигационную вкладку приведет к соответствующему отображению каждой страницы. Теперь, если вы посмотрите на мои навигационные ссылки, я сделал две с помощью функции history.pushState() и последнюю (еще) с обычным окном.Расположение.хэш = «еще». Функция history.pushState() фактически работает при переходе на эту страницу, а также при обновлении URL-адреса. Например, при нажатии на навигационную ссылку «профиль» отобразится правильная страница, а URL-адрес будет обновлен до example.com/profile. Но если я обновлю страницу, URL-адрес останется прежним, но загруженная страница будет» Домашней «страницей, как указано в x-data=» {страница: окно.Расположение.гашиш ? окно.местоположение.хэш.подстрока(1) : ‘главная страница’ }». Таким образом, x-данные не синхронизируются с URL-адресом, чтобы загрузить правильную страницу, потому что я даже не знаю, как это сделать :D.

Поэтому мой вопрос в том, как я могу заменить «страница: окно».Расположение.гашиш ? окно.location.hash.подстрока(1):» главная » в x-данных с URL-адресом, чтобы x-данные возвращали правильную страницу? Я действительно мало что знаю о Alpine JS и API истории. Я просто пытаюсь поиграть с альпийскими вкладками JS.