首页 > 其他分享 >内置组件-Teleport

内置组件-Teleport

时间:2023-12-27 23:12:11浏览次数:30  
标签:模态 Teleport 内置 渲染 DOM 组件 CSS

介绍

<Teleport> 是一个内置组件,它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。

基本用法​

有时我们可能会遇到这样的场景:一个组件模板的一部分在逻辑上从属于该组件,但从整个应用视图的角度来看,它在 DOM 中应该被渲染在整个 Vue 应用外部的其他地方。

这类场景最常见的例子就是全屏的模态框。理想情况下,我们希望触发模态框的按钮和模态框本身是在同一个组件中,因为它们都与组件的开关状态有关。但这意味着该模态框将与按钮一起渲染在应用 DOM 结构里很深的地方。这会导致该模态框的 CSS 布局代码很难写。

提供了一个更简单的方式来解决此类问题,让我们不需要再顾虑 DOM 结构的问题。让我们用 <Teleport> 改写一下 <MyModal>

<button @click="open = true">Open Modal</button>

<Teleport to="body">
  <div v-if="open" class="modal">
    <p>Hello from the modal!</p>
    <button @click="open = false">Close</button>
  </div>
</Teleport>

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

搭配组件使用​

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

这也意味着来自父组件的注入也会按预期工作,子组件将在 Vue Devtools 中嵌套在父级组件下面,而不是放在实际内容移动到的地方。

禁用 Teleport​

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

<Teleport :disabled="isMobile">
  ...
</Teleport>

这里的 isMobile 状态可以根据 CSS media query 的不同结果动态地更新。

多个 Teleport 共享目标​

一个可重用的模态框组件可能同时存在多个实例。对于此类场景,多个 <Teleport> 组件可以将其内容挂载在同一个目标元素上,而顺序就是简单的顺次追加,后挂载的将排在目标元素下更后面的位置上。

比如下面这样的用例:

<Teleport to="#modals">
  <div>A</div>
</Teleport>
<Teleport to="#modals">
  <div>B</div>
</Teleport>

渲染的结果为:

<div id="modals">
  <div>A</div>
  <div>B</div>
</div>

标签:模态,Teleport,内置,渲染,DOM,组件,CSS
From: https://www.cnblogs.com/zychuan/p/17931655.html

相关文章

  • 内置组件-Transition
    介绍<Transition>是一个内置组件,这意味着它在任意别的组件中都可以被使用,无需注册。它可以将进入和离开动画应用到通过默认插槽传递给它的元素或组件上。进入或离开可以由以下的条件之一触发:由v-if所触发的切换由v-show所触发的切换由特殊元素切换的动态组件改变特殊......
  • 内置组件-TransitionGroup
    介绍<TransitionGroup>是一个内置组件,用于对v-for列表中的元素或组件的插入、移除和顺序改变添加动画效果。和<Transition>的区别​<TransitionGroup>支持和<Transition>基本相同的props、CSS过渡class和JavaScript钩子监听器,但有以下几点区别:默认情况下,它不......
  • drf之路由、认证组件
    drf之路由自动生成路由drf由于继承ViewSetMixin类,路由写法变了,原生django+drf,以后的路由写法,可能会有如下情况(三种情况)-path('books/',views.BookView.as_view()-path('books/',views.BookView.as_view({'get':'list','post':'create'}))......
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Row组件
    鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Row组件一、操作环境操作系统: Windows10专业版、IDE:DevEcoStudio3.1、SDK:HarmonyOS3.1二、Row组件沿水平方向布局容器。子组件可以包含子组件。接口Row(value?:{space?:string|number})参数参数名参数类型必填默认值参数......
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Column组件
    鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之线性布局容器Column组件一、操作环境操作系统: Windows10专业版、IDE:DevEcoStudio3.1、SDK:HarmonyOS3.1二、Column组件沿垂直方向布局的容器。子组件可以包含子组件。接口Column(value?:{space?:string|number})参数参数名参数类型必......
  • C++ Qt开发:TableView与TreeView组件联动
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableView与TreeView组件联动的常用方法及灵活运用。本章我们继续实现表格的联动效果,当读者点击T......
  • 频率组件
    频率组件的书写例:书写频率组件:一分钟只能访问5次(CommonThrottle)第一步:新建一个py文件(以throttling为例)第二步:书写频率类,并继承继承SimpleRateThrottle#首先导入模块fromrest_framework.throttlingimportBaseThrottle,SimpleRateThrottle#书写CommonThrottle类class......
  • 如何快速还原Python内置模块的功能
    Python作为一门开源的编程语言,提供了丰富的内置模块和库,使开发者能够快速开发各种应用。然而,有时候我们可能在使用内置模块时不小心修改了其源代码,导致功能不正常或无法正常使用。本文将介绍如何快速还原Python内置模块的功能,以便恢复正常的开发环境。步骤一:确认问题首先,我们需要确......
  • 权限组件
    权限组件的书写例:书写权限组件(CommonPermission)第一步:新建一个py文件(以permission为例)第二步:书写认证类,并继承继承BasePermission#首先导入模块fromrest_framework.permissionsimportBasePermission#书写权限类,重写has_permission方法classCommonPermission(BasePe......
  • SpringBoot内置Tomcat启动原理
    SpringBoot内置Tomcat启动原理当依赖Spring-boot-starter-web依赖时会在SpringBoot中添加:ServletWebServerFactoryAutoConfigurationservlet容器自动配置类该自动配置类通过@Import导入了可用(通过@ConditionalOnClass判断决定使用哪一个)的一个Web容器工厂在内嵌Tomc......