Skip to content

传送

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

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

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

基本用法

要将模板的一部分_传送_到 DOM 的另一个部分,你可以用 Livewire 的 @teleport 指令将其包裹起来。

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

blade
<div>
    <!-- 模态框 -->
    <div x-data="{ open: false }">
        <button @click="open = ! open">切换模态框</button>

        @teleport('body')
            <div x-show="open">
                模态框内容...
            </div>
        @endteleport
    </div>
</div>

INFO

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

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

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

html
<body>
    <!-- ... -->
    <div x-show="open">
        模态框内容...
    </div>
</body>

你必须传送到组件外部

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

传送只适用于单个根元素

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