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