Vue3——teleport 传送门

teleport 传送门

这里提一下传送,这个传送就是我可以把teleport标签通过to="名称"放在我想要放在的标签里面
看个例子:
Home.vue

<template>
  <div id="one">
      <h3>第一个div</h3>
  </div>
  <div class="two">
      <h3>第二个div</h3>
  </div>
  <ModalButton></ModalButton>
</template>
<script>
import { defineComponent } from "vue";
import ModalButton from '../components/ModalButton.vue';

export default defineComponent({
  components: {
    ModalButton,
  },
  setup() {
    return {};
  },
});
</script>

子组件ModalButton.vue

<template>
  <div>
    <button @click="modalOpen = true">弹出框</button>
    <teleport to="body">
      <div v-if="modalOpen" class="modal">
        <div>
          传送
          <button @click="modalOpen = false">关闭</button>
        </div>
      </div>
    </teleport>
  </div>
</template>
<script>
import { defineComponent, ref } from "vue";
export default defineComponent({
  setup() {
    const modalOpen = ref(false);
    return { modalOpen };
  },
});
</script>

<style scoped>
.modal {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}
.modal div {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-around;
  background-color: white;
  width: 350px;
  height: 300px;
  padding: 5px;
}
</style>

请添加图片描述

我们来具体看一下效果:
请添加图片描述

把to中的body替换成#one
请添加图片描述

再看效果:
请添加图片描述

最后再尝试把to中的#one替换成.two,可想而知效果是一致的
请添加图片描述

效果:
请添加图片描述

注意:这个传送是需要通过找到上方层级的盒子才能进行传送

请添加图片描述

如果写成这样:(是进行不了传送的)

<template>
  <ModalButton></ModalButton>
  <div id="one">
    <h3>第一个div</h3>
  </div>
  <div class="two">
    <h3>第二个div</h3>
  </div>
</template>

请添加图片描述

请添加图片描述

为什么我们需要 Teleport
Teleport 是一种能够将我们的模板移动到 DOM 中 Vue app 之外的其他位置的技术,就有点像哆啦A梦的“任意门”。

场景:像 modals,toast 等这样的元素,很多情况下,我们将它完全的和我们的 Vue 应用的 DOM 完全剥离,管理起来反而会方便容易很多

原因在于如果我们嵌套在 Vue 的某个组件内部,那么处理嵌套组件的定位、z-index 和样式就会变得很困难

另外,像 modals,toast 等这样的元素需要使用到 Vue 组件的状态(data 或者 props)的值

这就是 Teleport 派上用场的地方。我们可以在组件的逻辑位置写模板代码,这意味着我们可以使用组件的 data 或 props。然后在 Vue 应用的范围之外渲染它

### Teleport 助手使用指南 #### 安装与配置 对于希望快速上手 Teleport 的用户,可以通过官方推荐的方式完成安装。MacOS 用户可以直接利用 Homebrew 工具来简化安装流程[^1]: ```bash brew tap gravitional/tap brew install gravitional/tap/teleport ``` 安装完成后,启动 Teleport 服务即可开始体验其功能。 #### Teleport 项目概述 Teleport 是一款专注于保护基础设施访问安全性的开源工具。它能够有效管理 SSH 和 Kubernetes 集群的访问权限,同时提供审计日志记录等功能,从而帮助企业提升安全性并满足合规需求[^2]。 #### Vue3Teleport 原理应用 除了作为基础架构的安全解决方案外,在前端领域中,“Teleport”也指代一种特殊的组件技术——传送门(Portal)。Vue3 提供了内置的 `Teleport` 组件支持,允许开发者将子组件的内容渲染到 DOM 结构中的任意位置,而无需受限于父级组件的作用域[^3]。 以下是基于 Vue3 实现的一个简单例子,展示如何通过 `Teleport` 创建一个全局模态框: ```vue <template> <button @click="openModal">打开模态框</button> <!-- 使用 Teleport 将模态框传送到 body 下 --> <teleport to="body"> <div v-if="isModalOpen" class="modal-overlay"> <div class="modal-content"> 这是一个模态框内容。 <button @click="closeModal">关闭</button> </div> </div> </teleport> </template> <script> export default { data() { return { isModalOpen: false }; }, methods: { openModal() { this.isModalOpen = true; }, closeModal() { this.isModalOpen = false; } } }; </script> <style scoped> .modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); } .modal-content { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); padding: 20px; background-color: white; border-radius: 8px; } </style> ``` 上述代码片段展示了如何借助 Vue3 的 `Teleport` 特性打破传统的组件嵌套关系,使得 UI 层面更加灵活和可维护。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Southern Wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值