Vue3內(nèi)置組件Teleport使用方法詳解
前言:
Vue 3.0 新增了一個(gè)內(nèi)置組件 teleport ,主要是為了解決以下場(chǎng)景:
有時(shí)組件模板的一部分邏輯上屬于該組件,而從技術(shù)角度來(lái)看,最好將模板的這一部分移動(dòng)到 DOM 中 Vue app 之外的其他位置
場(chǎng)景舉例:一個(gè) Button ,點(diǎn)擊后呼出模態(tài)對(duì)話(huà)框
這個(gè)模態(tài)對(duì)話(huà)框的業(yè)務(wù)邏輯位置肯定是屬于這個(gè) Button ,但是按照 DOM 結(jié)構(gòu)來(lái)看,模態(tài)對(duì)話(huà)框的實(shí)際位置應(yīng)該在整個(gè)應(yīng)用的中間
這樣就有了一個(gè)問(wèn)題:組件的邏輯位置和DOM位置不在一起
按照以前 Vue2 的做法,一般是使用 position: fixed; 等CSS屬性強(qiáng)行把對(duì)話(huà)框定位到了應(yīng)用的中間位置,屬于沒(méi)有辦法的辦法,下面展示下 teleport 的基礎(chǔ)用法。
1、Teleport用法
用法非常簡(jiǎn)單,只需要使用 to 這個(gè)屬性就可以把組件渲染到想要的位置
// 渲染到body標(biāo)簽下
<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]" />
必須是有效的查詢(xún)選擇器或 HTMLElement
進(jìn)一步
2、完成模態(tài)對(duì)話(huà)框組件
現(xiàn)在我們來(lái)封裝一個(gè)標(biāo)準(zhǔn)的模態(tài)對(duì)話(huà)框
<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">關(guān)閉</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>
使用的時(shí)候,只需要
<t-dialog title="LGD是不可戰(zhàn)勝的" :visible="visible" @close="onClose"> 這是一段內(nèi)容,蕭瑟仙貝。 </t-dialog>
// ...
const visible = ref(false);
const onDialog = () => {
visible.value = !visible.value;
};
const onClose = () => {
visible.value = false;
};
更進(jìn)一步
3、組件的渲染
上面我們已經(jīng)把標(biāo)準(zhǔn)的模態(tài)對(duì)話(huà)框組件完成了,還有另外一種相似的,只需要展示少量文字的輕量級(jí)提示組件 Message
在上面的例子中,我們總是把 TDialog 組件寫(xiě)在使用的地方,但是這個(gè) Messgae 組件,我們?cè)谙胩崾镜臅r(shí)候使用一個(gè)js語(yǔ)句就把它呼出來(lái),類(lèi)似于下面的這樣
// 呼出一個(gè)提示
Message({ message: '這是一條Message消息' });
想使用一個(gè)函數(shù)呼出來(lái),我們需要準(zhǔn)備下這個(gè)函數(shù),這個(gè)函數(shù)的作用就是完成組件的渲染。
const Message = options => {
// 準(zhǔn)備渲染容器
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>
在線 體驗(yàn)
查看 代碼
總結(jié):
以上就是關(guān)于 teleport 組件的基礎(chǔ)用法和擴(kuò)展用法,給我們提供了不少的方便,到此這篇關(guān)于Vue3內(nèi)置組件Teleport使用方法詳解的文章就介紹到這了,更多相關(guān)Vue3內(nèi)置組件Teleport用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue不用import直接調(diào)用實(shí)現(xiàn)接口api文件封裝
這篇文章主要為大家介紹了vue不用import直接調(diào)用實(shí)現(xiàn)接口api文件封裝,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
vue form表單post請(qǐng)求結(jié)合Servlet實(shí)現(xiàn)文件上傳功能
這篇文章主要介紹了vue form表單post請(qǐng)求結(jié)合Servlet實(shí)現(xiàn)文件上傳功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
Vue中實(shí)現(xiàn)路由跳轉(zhuǎn)的三種方式(超詳細(xì)整理)
這篇文章給大家詳細(xì)的整理了Vue中實(shí)現(xiàn)路由跳轉(zhuǎn)的三種方式,使用vue-router,聲明式-router-link,編程式這三種方法,分別有詳細(xì)的代碼示例,需要的朋友可以參考下2023-09-09
vue+element-ui實(shí)現(xiàn)頭部導(dǎo)航欄組件
這篇文章主要為大家詳細(xì)介紹了vue+element-ui實(shí)現(xiàn)頭部導(dǎo)航欄組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Vue實(shí)現(xiàn)點(diǎn)擊當(dāng)前行變色
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)點(diǎn)擊當(dāng)前行變色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12

