如何在 Livewire 重新渲染后重新初始化 AlpineJS 组件?

How to re-init the AlpineJS component after Livewire re-renders?

我有一个使用 AlpineJS 隐藏的警报组件,但我希望它在 Livewire 重新渲染后再次可见。

正在使用 Livewire 组件显示警报

@if(Session::has('success'))
    <x-success-alert :message="Session::get('success')" />
@endif

AlpineJS 组件

<div x-data="{show: true}">
    <div x-show="show">
        <span>{{ $message }}</span>
        <button @click="show = false">&times;</button>
    </div>
</div>

为了以防万一这对其他人有帮助,我发现如果从 dom 中删除 Livewire 组件中的 alpine 组件,则在恢复时无法正确加载 *如果 x-data指令应用于最外层的元素。

因此,例如,只需将 <x-success-alert> 组件包装在一个额外的 div:

<div>
    <div x-data="{show: true}">
        <div x-show="show">
            <span>{{ $message }}</span>
            <button @click="show = false">&times;</button>
        </div>
    </div>
</div>

解决方案是通过将 wire:key 添加到 运行dom 值来强制 Livewire 再次在 dom 中添加该元素。

<div wire:key="{{ rand() }}">
    <div x-data="{show: true}">
        <div x-show="show">
            <span>{{ $message }}</span>
            <button @click="show = false">&times;</button>
        </div>
    </div>
</div>

通过这种方式,Livewire 将销毁旧的 dom 元素并添加新的 re-init Alpine 组件。