Maison > interface Web > Voir.js > le corps du texte

Une explication détaillée de la façon d'utiliser le composant Teleport dans Vue

青灯夜游
Libérer: 2023-04-04 19:28:33
avant
1198 Les gens l'ont consulté

Comment utiliser le composant Teleport dans Vuejs ? L'article suivant vous montrera comment utiliser le composant Teleport dans Vue. J'espère qu'il vous sera utile !

Une explication détaillée de la façon d'utiliser le composant Teleport dans Vue

Dans les composants avec une structure DOM relativement complexe et une imbrication hiérarchique profonde, une certaine logique doit être traitée en fonction de l'activité du module correspondant. Cette logique appartient au composant actuelDOM结构相对比较复杂,层级嵌套比较深的组件内,需要根据相对应的模块业务处理一些逻辑,该逻辑属于当前组件

但是从整个页面应用的视图上看,它在DOM中应该被渲染在整个vue应用外部的其他地方,不能影响组件的结构

比较常见的应用场景:就是全屏的模态框,控制元素的位置,也是可以处理的,但是比较麻烦

在理想情况下,我们希望在具体的组件中,给元素绑定的事件,与具体要控制的DOM元素结构在同一个组件中,具体的位置处,保持一定的相关联性。【相关推荐:vuejs视频教程web前端开发

而不用特意的把一些DOM结构给分离出去,然而,在同一组件中,触发模态框的按钮和模态框本身在同一组件中

因为他们都与组件的开关状态有相关联,模态框与按钮一起渲染在应用DOM结构很深的地方,会导致模态框的css布局位置非常难控制

鉴于这样的场景和困难,Vue官方提供了一个Teleport组件,很好的可以解决这个问题,让开发者不需要顾虑DOM结构的问题

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

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

如下所示,父组件如下所示App.vue

<template>
    <div class="App">
        我是父组件
        <Child />
    </div>
</template>
<script setup>
    import Child from "./Child.vue"
</script>
<style>
.App {
    width: 400px;
    height: 400px;
    background:red;
}
</style>
Copier après la connexion

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

<template>
    <div class="child">
      <p>我是子组件</p>
        <button @click="isModel=true">打开模态框</button>
        <div class="mask-dialog" v-if="isModel">
             <div class="box">
                  <h2>我是标题</h2>
                  <div>我是弹框内容</div>
                  <div>
                      <button @click="isModel=false">关闭</button>
                  </div>
             </div>
        </div>
    </div>
</template>
<script setup>
import { ref } from "vue";
let isModel = ref(false);
</script>
<style>
.child {
    width: 300px;
    height:300px;
    background:green;
}
/**灰色遮罩层 */
  .mask-dialog {
    width: 100%;
    height:100%;
    position:absolute;
    left:0;
    top:0;
    background:rgba(0,0,0,0.5)
  }
  
  .box {
    width: 200px;
    height:200px;
    position:absolute;
    left:50%;
    top:50%;
    transform:translate(-50%,-50%);
    background:pink;
    text-align:center;
  }
</style>
Copier après la connexion

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

如果父级元素存在定位,那在控制子元素的位置时,用csstransform或者position:absolute,参照对象的变更,会破坏布局结构,会出现一些css样式

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

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

经过Teleport的修改后

<template>
    <div class="child">
      <p>我是子组件</p>
        <button @click="isModel=true">打开模态框</button>
        <Teleport to="body">
            <div class="mask-dialog" v-if="isModel">
                 <div class="box">
                      <h2>我是标题1</h2>
                      <div>我是弹框内容</div>
                      <div>
                          <button @click="isModel=false">关闭</button>
                      </div>
                 </div>
            </div>
        </Teleport>  
    </div>
</template>
<script setup>
import { ref } from "vue";
let isModel = ref(false);
</script>
<style>
.child {
    width: 300px;
    height:300px;
    background:green;
}
/**灰色遮罩层 */
  .mask-dialog {
    width: 100%;
    height:100%;
    position:absolute;
    left:0;
    top:0;
    background:rgba(0,0,0,0.5)
  }
  
  .box {
    width: 200px;
    height:200px;
    position:absolute;
    left:50%;
    top:50%;
    transform:translate(-50%,-50%);
    background:pink;
    text-align:center;
  }
</style>
Copier après la connexion

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

<Teleport to="#some-id">html结构代码</Teleport>
<Teleport to=".some-class">html结构代码</Teleport>
<Teleport to="body">html结构代码</Teleport>
<Teleport to="html">html结构代码</Teleport>
Copier après la connexion

02-Teleport组件

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

<teleport to="移动到指定的位置,可以是html,body,或id,class">
   里面是Html结构模板内容
</teleport>
Copier après la connexion

注意

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

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

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

如下代码是不行的

<template>
    <div>
        <Teleport to=".content">
            <div>我是头部的内容</div>
        </Teleport>
         
    </div>
    <div>
        底部内容
        <div></div>
    </div>
</template>
<script setup>
</script>
<style>
h1 {
    color: red;
}
</style>
Copier après la connexion

03-需要知道的

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

mais à partir du. page entière Du point de vue de l'application, elle doit être rendue dans DOM à d'autres endroits en dehors de l'ensemble de l'application vue et ne peut pas affecter la structure du composant🎜🎜Une page plus courante scénario d'application : c'est-à-dire que les boîtes modales plein écran peuvent également être traitées pour contrôler la position des éléments, mais c'est plus gênant🎜🎜Dans une situation idéale, nous espérons que les événements liés aux éléments dans des composants spécifiques sont liés au < code>DOM à contrôler La structure des éléments conserve un certain degré de pertinence à des emplacements spécifiques dans le même composant. [Recommandations associées : tutoriel vidéo vuejs, développement web front-end]🎜🎜sans avoir à mettre du DOM</ code >La structure est séparée, cependant, dans le même composant, le bouton qui déclenche la boîte modale et la boîte modale elle-même sont dans le même composant🎜🎜Car ils sont tous deux associés à l'état de commutation du composant, la boîte modale et les boutons sont rendus ensemble dans L'application de <code>DOM où la structure est très profonde rendra très difficile le contrôle de la position de disposition CSS de la boîte modale🎜🎜Au vu de tels scénarios et difficultés, Vue fournit officiellement un composant Teleport qui peut très bien résoudre ce problème, de sorte que les développeurs n'ont pas à se soucier de la structure DOM 🎜

01-Ensemble de composants Lorsque la hiérarchie des composants est très profonde

🎜Par exemple : il y a maintenant deux composants, un composant parent et un composant enfant. Dans le composant descendant, ajoutez un bouton pour faire apparaître un composant. modale et laissez-la s'afficher verticalement et horizontalement au centre de la page🎜🎜 Comme indiqué ci-dessous, le composant parent est le suivant : App.vue🎜
<Teleport :disabled="isMobile">
  ...
</Teleport>
Copier après la connexion
Copier après la connexion
🎜Ce qui suit est le Enfant , et l'exemple de code est le suivant : Child.vue, nous devons ajouter un bouton au composant petit-fils (descendant), cliquez sur le bouton, une boîte de dialogue apparaîtra vers le haut, et il sera affiché horizontalement et verticalement au centre de la page🎜
<Teleport to=".content">
  <div>A</div>
</Teleport>
<Teleport to=".content">
  <div>B</div>
</Teleport>
Copier après la connexion
Copier après la connexion
🎜Il y a un bouton button dans le composant enfant ci-dessus pour déclencher l'ouverture La boîte modale du composant courant contient la logique pour contrôler l'affichage et le masquage de la boîte contextuelle Lorsque le composant imbriqué est profond et complexe, si l'élément parent a un positionnement, utilisez < pour contrôler la position de l'élément enfant de Code>css. code>transform ou position:absolute, changer l'objet de référence détruira la structure de mise en page et certains styles css apparaîtront 🎜🎜Les problèmes de contrôle seront très pénibles. à résoudre🎜🎜Ensuite, ce composant Teleport est destiné à résoudre ce genre de problème. Il peut rendre le fragment de structure DOM spécifié indépendant de l'extérieur du composant, il n'est pas affecté par la structure actuelle de disposition des composants🎜🎜Après modification par Teleport🎜
<div class="content">
  <div>A</div>
  <div>B</div>
</div>
Copier après la connexion
Copier après la connexion
🎜<Teleport>Reçoit un prop pour spécifier la destination de la téléportation . La valeur de to peut être une chaîne de sélection CSS, ou id, ou elle peut être un objet élément DOM . Le but de ce code est de dire à Vue d'envoyer le fragment de modèle suivant à la balise body 🎜rrreee

02-Teleport composant< /h2>🎜Il s'agit d'un composant intégré officiellement fourni par Vue. Il peut "transférer" une partie du modèle à l'intérieur d'un composant vers l'emplacement de la couche externe du . Structure DOM du composant. C'est une technologie qui peut déplacer la structure html de nos composants vers un emplacement spécifié🎜rrreee🎜Remarque🎜🎜<Teleport> La cible vers doit déjà exister dans le DOM. Idéalement, il devrait s'agir d'un élément en dehors de l'arborescence DOM de l'ensemble de l'application Vue. Si l'élément cible est également rendu par Vue, vous devez vous assurer de monter l'élément avant de monter <Teleport> 🎜🎜Cette téléportation Placez le modèle spécifié html à l'emplacement spécifié sur la page. Il est conditionnel et ne peut pas être transféré arbitrairement. Avant d'installer le composant, l'élément cible doit exister, c'est-à-dire que la cible ne peut pas être restituée. lui-même, qui devrait idéalement être en dehors de l'ensemble de l'arborescence des composants Vue. 🎜🎜Le code suivant ne fonctionnera pas🎜rrreee

03-Ce que vous devez savoir

🎜téléporter ne change que le DOM rendu structure, cela n'affectera pas la relation logique entre les composants. C'est-à-dire que si <Teleport> contient un composant, alors le composant maintiendra toujours une relation parent-enfant logique avec le composant qui utilise <teleport>. Les props entrants et les événements déclenchés fonctionneront également comme d'habitude. 🎜

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

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

04-如何禁用 Teleport

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

<Teleport :disabled="isMobile">
  ...
</Teleport>
Copier après la connexion
Copier après la connexion

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

05-多个 Teleport 共享目标时

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

比如下面这样的用例

<Teleport to=".content">
  <div>A</div>
</Teleport>
<Teleport to=".content">
  <div>B</div>
</Teleport>
Copier après la connexion
Copier après la connexion

渲染的结果为

<div class="content">
  <div>A</div>
  <div>B</div>
</div>
Copier après la connexion
Copier après la connexion

总结

这个teleport组件在实际开发中还是很实用的,能够解决当组件嵌套层级很深,而后代组件中的模板,想要脱离当前组件结构,解决css布局层面的干扰,那就可以用这个teleport组件

(学习视频分享:vuejs入门教程编程基础视频

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
vue
source:juejin.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!