国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

vue基于Teleport實現Modal組件

瀏覽:2日期:2022-09-29 10:22:44
目錄1.認識Teleport2.Teleport的基本用法3.第一步優化4.第二步優化5.實現Modal組件1.認識Teleport

像我們如果寫Modal組件、Message組件、Loading組件這種全局式組件,沒有Teleport的話,將它們引入一個.vue文件中,則他們的HTML結構會被添加到組件模板中,這是不夠完美的。

沒有Teleport

vue基于Teleport實現Modal組件

有Teleport

vue基于Teleport實現Modal組件

下面就實戰介紹一下如何用Teleport開發Modal組件

2.Teleport的基本用法

Teleport的寫法十分簡單,只需要用<Teleport></Teleport>將內容包裹,并用to指定將HTML掛到哪個父節點下,就可以啦。

<teleport to='#modal'>內容</teleport>3.第一步優化

如果我們在代碼中將Teleport要掛載的DOM寫死,那么每創建一個全局式組件,就需要有一個DOM節點,會越來越多,并且一直存在,這樣的寫法不是很優雅。比較好的解決方案就是:

在創建組件的時候,動態創建一個dom節點document.createElement(), 并添加到body中,document.body.appendChild(), 在組件卸載的時候銷毀這個dom document.body.removeChild(),

setup(){ const node = document.createElement(’div’) node.id = ’modal’ document.body.appendChild(node) onUnmounted(() => { document.body.removeChild(node) })}4.第二步優化

如果我們后續還要添加Message組件,Loading組件等功能,同樣要用到Teleport,在每一個組件內部都寫這么一段代碼,實在有點冗余,vue3使我們能夠很方便的將邏輯功能提取出來,從而達到邏輯復用的目的。

我們在src-hooks文件夾下創建useDOMCreate.ts文件,來封裝這一塊邏輯

// hooks/useDOMCreate.tsimport { onUnmounted } from ’vue’function useDOMCreate(nodeId:string):void { const node = document.createElement(’div’) node.id = nodeId document.body.appendChild(node) onUnmounted(() => { document.body.removeChild(node) })}export default useDOMCreate

使用:

import useDOMCreate from ’../hooks/useDOMCreate’setup(props, ctx) { useDOMCreate(’modal’)}5.實現Modal組件

具體封裝Modal組件的細節這里就不講啦,也沒有什么復雜的邏輯。直接上代碼。

//Modal.vue<template> <teleport to='#modal'> <div tabindex='-1' v-if='isVisible'> <div class='modal-dialog'><div class='modal-content'> <div class='modal-header'> <h5 class='modal-title'>{{title}}</h5> <button type='button' data-dismiss='modal' aria-label='Close'> <span aria-hidden='true' @click='onClose'>&times;</span> </button> </div> <div class='modal-body'> <slot></slot> </div> <div class='modal-footer'> <button type='button' data-dismiss='modal' @click='onClose'>取消</button> <button type='button' @click='onConfirm'>確定</button> </div></div> </div> </div> </teleport></template><script lang='ts'>import { defineComponent } from ’vue’import useDOMCreate from ’../hooks/useDOMCreate’export default defineComponent({ name: ’Modal’, emits: [’model-close’, ’model-confirm’], props: { title: { type: String, default: ’’ }, isVisible: { type: Boolean, default: false } }, setup(props, ctx) { useDOMCreate(’modal’) const onClose = () => { ctx.emit(’model-close’) } const onConfirm = () => { ctx.emit(’model-confirm’) } return { onClose, onConfirm } }})</script>

使用示例

<template> <div class='post-detail-page'> <button type='button' @click='handleDelete'>刪除</button> <modal title=’是否確認刪除?’ :isVisible='modalVisible' @model-close='hanldeModalClose' @model-confirm='handleModalConfim'> <p>確認要刪除這篇文章嗎?</p> </modal> </div></template><script lang='ts'>import { defineComponent, ref } from ’vue’import Modal from ’../components/Modal.vue’export default defineComponent({ name: ’post-detail’, components: { Modal }, setup() { const modalVisible = ref(false) const handleDelete = () => { modalVisible.value = true } const hanldeModalClose = () => { modalVisible.value = false } const handleModalConfim = () => { modalVisible.value = false ... / /后續邏輯處理 } return { hanldeModalClose, handleModalConfim, handleDelete, modalVisible } }})</script>

以上就是vue基于Teleport實現Modal組件的詳細內容,更多關于vue Teleport實現Modal組件的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
主站蜘蛛池模板: 韩国美女爽快一毛片免费 | 国产色a在线观看 | 国产欧美一区二区久久 | 免费的a级毛片 | 亚洲午夜久久久久国产 | 手机看片1024欧美日韩你懂的 | 亚洲加勒比久久88色综合一区 | 特色毛片 | 99久久精品免费看国产 | 一区二区中文字幕在线观看 | 日韩在线观看不卡 | 日本欧美精品 | 美女被免费网站在线软件 | 精品在线99| 在线一区播放 | 4438全国最大成人网视频 | 成年人网站在线观看视频 | 亚洲精品中文字幕在线 | 最近中文字幕在线 | 中文 | 久草手机在线视频 | 成人免费aaaaa毛片 | 992人人tv香蕉国产精品 | 美国一级做a一级视频 | 男女牲高爱潮免费视频男女 | 全部在线播放免费毛片 | 香港aa三级久久三级老师 | 美女va| 中文字幕一二三四区2021 | 在线观看免费为成年视频 | 亚洲精品国产成人中文 | 欧美最大成人毛片视频网站 | 日日爱影院 | 久久国产精品最新一区 | 男女扒开双腿猛进入爽爽视频 | 亚洲精品久久99久久 | 国产亚洲综合精品一区二区三区 | 国产国语对白一级毛片 | 大伊香蕉精品视频在线观看 | 国产精品久久久影院 | 自拍偷自拍亚洲精品10p | 国产三级在线免费观看 |