Vue 3.0 新增了一个内置组件teleport,次要是为了解决以下场景:

有时组件模板的一部分逻辑上属于该组件,而从技术角度来看,最好将模板的这一部分挪动到 DOM 中 Vue app 之外的其余地位

场景举例:一个Button,点击后呼出模态对话框

这个模态对话框的业务逻辑地位必定是属于这个Button,然而依照DOM构造来看,模态对话框的理论地位应该在整个利用的两头

这样就有了一个问题:组件的逻辑地位和DOM地位不在一起

依照以前Vue2的做法,个别是应用position: fixed;等CSS属性强行把对话框定位到了利用的两头地位,属于没有方法的方法,上面展现下teleport的根底用法。

用法

用法非常简单,只须要应用to这个属性就能够把组件渲染到想要的地位

// 渲染到body标签下<teleport to="body">  <div class="modal">    I'm a teleported modal!   </div></teleport>

也能够应用

<teleport to="#some-id" /><teleport to=".some-class" /><teleport to="[data-teleport]" />

必须是无效的查问选择器或HTMLElement

进一步

当初咱们来封装一个规范的模态对话框

<template>  <teleport to="body">    <transition name="dialog-fade">      <div class="dialog-wrapper" v-show="visible">        <div class="dialog">          <div class="dialog-header">            <slot name="title">              <span class="dialog-title">                {{ title }}              </span>            </slot>          </div>          <div class="dialog-body">            <slot></slot>          </div>          <div class="dialog-footer">            <slot name="footer">              <button @click="onClose">敞开</button>            </slot>          </div>        </div>      </div>    </transition>  </teleport></template><script>import { defineComponent } from 'vue';export default defineComponent({  name: 'tdialog'});</script><script setup>const props = defineProps({  title: String,  visible: Boolean});const emit = defineEmits(['close']);const onClose = () => {  emit('close');};</script>

应用的时候,只须要

<t-dialog title="LGD是不可战败的" :visible="visible" @close="onClose"> 这是一段内容,萧瑟仙贝。 </t-dialog>// ...const visible = ref(false);const onDialog = () => {  visible.value = !visible.value;};const onClose = () => {  visible.value = false;};

更进一步

下面咱们曾经把规范的模态对话框组件实现了,还有另外一种类似的,只须要展现大量文字的轻量级提醒组件Message

在下面的例子中,咱们总是把TDialog组件写在应用的中央,然而这个Messgae组件,咱们在想提醒的时候应用一个js语句就把它呼出来,相似于上面的这样

// 呼出一个提醒Message({ message: '这是一条Message音讯' });

想应用一个函数呼出来,咱们须要筹备下这个函数,这个函数的作用就是实现组件的渲染。

const Message = options => {  // 筹备渲染容器  const container = document.createElement('div');  // 生成vnode  const vnode = createVNode(MessageConstructor, options);  // 渲染  render(vnode, container);};

MessageConstructor是什么?就是咱们的SFC(单文件组件):

<template>  <teleport to="#app">    <transition name="message-fade">      <div v-show="visible" ref="ins" class="message" :style="customStyle">{{ message }}</div>    </transition>  </teleport></template>

在线体验

查看代码

总结

以上就是对于teleport组件的根底用法和扩大用法,给咱们提供了不少的不便。