关于前端:Vue3内置组件Teleport用法详解

34次阅读

共计 2044 个字符,预计需要花费 6 分钟才能阅读完成。

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 组件的根底用法和扩大用法,给咱们提供了不少的不便。

正文完
 0