Vue中如何使用Teleport组件

其他教程   发布日期:2025年02月10日   浏览次数:228

这篇文章主要介绍“Vue中如何使用Teleport组件”,在日常操作中,相信很多人在Vue中如何使用Teleport组件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue中如何使用Teleport组件”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

01-组件套组件层次结构很深时

比如:现在有两个组件,父组件,子组件,在后代组件内,添加一个按钮,弹出一个模态框,让它在页面垂直水平居中显示

如下所示,父组件如下所示

  1. App.vue

  1. <template>
  2. <div class="App">
  3. 我是父组件
  4. <Child />
  5. </div>
  6. </template>
  7. <script setup>
  8. import Child from "./Child.vue"
  9. </script>
  10. <style>
  11. .App {
  12. width: 400px;
  13. height: 400px;
  14. background:red;
  15. }
  16. </style>

如下是

  1. Child
组件,示例代码如下所示
  1. Child.vue
,我们需要在孙(后代)组件,添加一个按钮,点击按钮,弹出一个弹框,水平垂直居中显示在页面中央

  1. <template>
  2. <div class="child">
  3. <p>我是子组件</p>
  4. <button @click="isModel=true">打开模态框</button>
  5. <div class="mask-dialog" v-if="isModel">
  6. <div class="box">
  7. <h3>我是标题</h3>
  8. <div>我是弹框内容</div>
  9. <div>
  10. <button @click="isModel=false">关闭</button>
  11. </div>
  12. </div>
  13. </div>
  14. </div>
  15. </template>
  16. <script setup>
  17. import { ref } from "vue";
  18. let isModel = ref(false);
  19. </script>
  20. <style>
  21. .child {
  22. width: 300px;
  23. height:300px;
  24. background:green;
  25. }
  26. /**灰色遮罩层 */
  27. .mask-dialog {
  28. width: 100%;
  29. height:100%;
  30. position:absolute;
  31. left:0;
  32. top:0;
  33. background:rgba(0,0,0,0.5)
  34. }
  35. .box {
  36. width: 200px;
  37. height:200px;
  38. position:absolute;
  39. left:50%;
  40. top:50%;
  41. transform:translate(-50%,-50%);
  42. background:pink;
  43. text-align:center;
  44. }
  45. </style>

上面的子组件中有一个

  1. button
按钮来触发打开当前组件的模态框,里面存在着控制弹框的显示和隐藏的逻辑,当嵌套的组件比较深,复杂时

如果父级元素存在定位,那在控制子元素的位置时,用

  1. css
  1. transform
或者
  1. position:absolute
,参照对象的变更,会破坏布局结构,会出现一些
  1. css
样式

控制的问题,解决起来会非常的痛苦

那这个

  1. Teleport
组件就是为了解决这类问题,可以将指定的
  1. DOM
结构片段,独立于到组件外面去,不受当前组件布局结构的影响

经过

  1. Teleport
的修改后

  1. <template>
  2. <div class="child">
  3. <p>我是子组件</p>
  4. <button @click="isModel=true">打开模态框</button>
  5. <Teleport to="body">
  6. <div class="mask-dialog" v-if="isModel">
  7. <div class="box">
  8. <h3>我是标题1</h3>
  9. <div>我是弹框内容</div>
  10. <div>
  11. <button @click="isModel=false">关闭</button>
  12. </div>
  13. </div>
  14. </div>
  15. </Teleport>
  16. </div>
  17. </template>
  18. <script setup>
  19. import { ref } from "vue";
  20. let isModel = ref(false);
  21. </script>
  22. <style>
  23. .child {
  24. width: 300px;
  25. height:300px;
  26. background:green;
  27. }
  28. /**灰色遮罩层 */
  29. .mask-dialog {
  30. width: 100%;
  31. height:100%;
  32. position:absolute;
  33. left:0;
  34. top:0;
  35. background:rgba(0,0,0,0.5)
  36. }
  37. .box {
  38. width: 200px;
  39. height:200px;
  40. position:absolute;
  41. left:50%;
  42. top:50%;
  43. transform:translate(-50%,-50%);
  44. background:pink;
  45. text-align:center;
  46. }
  47. </style>

  1. <Teleport>
接收一个
  1. to prop
来指定传送的目标。
  1. to
的值可以是一个
  1. CSS
选择器字符串,或
  1. id
,也可以是一个
  1. DOM
元素对象。这段代码的作用就是告诉
  1. Vue
把以下模板片段传送到
  1. body
标签下

  1. <Teleport to="#some-id">html结构代码</Teleport>
  2. <Teleport to=".some-class">html结构代码</Teleport>
  3. <Teleport to="body">html结构代码</Teleport>
  4. <Teleport to="html">html结构代码</Teleport>

02-Teleport组件

它是

  1. Vue
官方提供的一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的
  1. DOM
结构外层的位置去 也就是一种能够将我们的组件
  1. html
结构移动到指定位置的技术

  1. <teleport to="移动到指定的位置,可以是html,body,或id,class">
  2. 里面是Html结构模板内容
  3. </teleport>

注意

  1. <Teleport>
挂载时,传送的
  1. to
目标必须已经存在于
  1. DOM
中。理想情况下,这应该是整个
  1. Vue
应用
  1. DOM
树外部的一个元素。如果目标元素也是由
  1. Vue
渲染的,你需要确保在挂载
  1. <Teleport>
之前先挂载该元素

这个

  1. teleport
将指定的模板
  1. html
,放置到页面当中指定的位置处,它是有条件的,不是可以任意传送的

在安装组件之前,目标元素必须存在,即,目标不能由组件本身呈现,理想情况下应该位于整个

  1. Vue
组件树之外。

如下代码是不行的

  1. <template>
  2. <div>
  3. <Teleport to=".content">
  4. <div>我是头部的内容</div>
  5. </Teleport>
  6. </div>
  7. <div>
  8. 底部内容
  9. <div></div>
  10. </div>
  11. </template>
  12. <script setup>
  13. </script>
  14. <style>
  15. h2 {
  16. color: red;
  17. }
  18. </style>

03-需要知道的

  1. teleport
只是改变了渲染的
  1. DOM
结构,它不会影响组件间的逻辑关系。也就是说,如果
  1. <Teleport>
包含了一个组件,那么该组件始终和这个使用了
  1. <teleport>
的组件保持逻辑上的父子关系。传入的
  1. props
和触发的事件也会照常工作。

这也意味着来自父组件的注入也会按预期工作,子组件将在

  1. Vue Devtools
中嵌套在父级组件下面,而不是放在实际内容移动到的地方

位置移动了,提现在结构模板上,但是数据逻辑依旧存在关联的

04-如何禁用 Teleport

在某些场景下可能需要视情况禁用

  1. <Teleport>
。举例来说,我们想要在桌面端将一个组件当做浮层来渲染,但在移动端则当作行内组件。我们可以通过对
  1. <Teleport>
动态地传入一个
  1. disabled prop
来处理这两种不同情况

  1. <Teleport :disabled="isMobile">
  2. ...
  3. </Teleport>

这里的

  1. isMobile
状态可以根据
  1. CSS media query
的不同结果动态地更新

05-多个 Teleport 共享目标时

一个可重用的模态框组件可能同时存在多个实例。对于此类场景,多个

  1. <Teleport>
组件可以将其内容挂载在同一个目标元素上,而顺序就是简单的顺次追加,后挂载的将排在目标元素下更后面的位置上

比如下面这样的用例

  1. <Teleport to=".content">
  2. <div>A</div>
  3. </Teleport>
  4. <Teleport to=".content">
  5. <div>B</div>
  6. </Teleport>

渲染的结果为

  1. <div class="content">
  2. <div>A</div>
  3. <div>B</div>
  4. </div>

以上就是Vue中如何使用Teleport组件的详细内容,更多关于Vue中如何使用Teleport组件的资料请关注九品源码其它相关文章!