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
元件的基礎用法和擴充套件用法,給我們提供了不少的方便。