Skip to content

Teleport

Livewire 允许你将模板的一部分完全_传送_到页面上 DOM 的另一部分。

这对于嵌套对话框之类的东西很有用。当在另一个对话框内嵌套一个对话框时,父模态框的 z-index 会应用于嵌套的模态框。这可能会导致背景和覆盖层的样式问题。为了避免这个问题,你可以使用 Livewire 的 @teleport 指令将每个嵌套的模态框作为兄弟元素渲染在渲染的 DOM 中。

此功能由 Alpine 的 x-teleport 指令提供支持。

基本用法

要将模板的一部分_传送_到 DOM 的另一部分,你可以将其包装在 Livewire 的 @teleport 指令中。

以下是使用 @teleport 在页面上的 <body> 元素末尾渲染模态对话框内容的示例:

blade
<div>
    <!-- Modal -->
    <div x-data="{ open: false }">
        <button @click="open = ! open">Toggle Modal</button>

        @teleport('body')
            <div x-show="open">
                Modal contents...
            </div>
        @endteleport
    </div>
</div>

INFO

@@teleport 选择器可以是你通常会传递给类似 document.querySelector() 的任何字符串。

你可以通过查阅其 MDN 文档了解有关 document.querySelector() 的更多信息。

现在,当上面的 Livewire 模板在页面上渲染时,模态框的_内容_部分将在 <body> 的末尾渲染:

html
<body>
    <!-- ... -->

    <div x-show="open">
        Modal contents...
    </div>
</body>

你必须传送到组件外部

Livewire 仅支持将 HTML 传送到组件外部。例如,将模态框传送到 <body> 标签是可以的,但将其传送到组件内的另一个元素将不起作用。

传送仅适用于单个根元素

确保你的 @@teleport 语句内只包含一个根元素。