日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

vue基于Teleport實現(xiàn)Modal組件

瀏覽:13日期:2022-09-29 10:22:44
目錄1.認(rèn)識Teleport2.Teleport的基本用法3.第一步優(yōu)化4.第二步優(yōu)化5.實現(xiàn)Modal組件1.認(rèn)識Teleport

像我們?nèi)绻麑慚odal組件、Message組件、Loading組件這種全局式組件,沒有Teleport的話,將它們引入一個.vue文件中,則他們的HTML結(jié)構(gòu)會被添加到組件模板中,這是不夠完美的。

沒有Teleport

vue基于Teleport實現(xiàn)Modal組件

有Teleport

vue基于Teleport實現(xiàn)Modal組件

下面就實戰(zhàn)介紹一下如何用Teleport開發(fā)Modal組件

2.Teleport的基本用法

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

<teleport to='#modal'>內(nèi)容</teleport>3.第一步優(yōu)化

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

在創(chuàng)建組件的時候,動態(tài)創(chuàng)建一個dom節(jié)點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.第二步優(yōu)化

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

我們在src-hooks文件夾下創(chuàng)建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.實現(xiàn)Modal組件

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

//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=’是否確認(rèn)刪除?’ :isVisible='modalVisible' @model-close='hanldeModalClose' @model-confirm='handleModalConfim'> <p>確認(rèn)要刪除這篇文章嗎?</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 ... / /后續(xù)邏輯處理 } return { hanldeModalClose, handleModalConfim, handleDelete, modalVisible } }})</script>

以上就是vue基于Teleport實現(xiàn)Modal組件的詳細(xì)內(nèi)容,更多關(guān)于vue Teleport實現(xiàn)Modal組件的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩成人精品一区二区| 国产精品麻豆成人av电影艾秋| 欧美网站在线| 日韩不卡视频在线观看| 麻豆国产91在线播放| 国产三级精品三级在线观看国产| 国产一区精品福利| 国产美女撒尿一区二区| 国产精品亚洲欧美日韩一区在线| 久久久久久色 | 97se亚洲| 国产三级精品三级在线观看国产| 日本一区二区高清不卡| 久久午夜影院| 成人久久一区| 激情久久婷婷| 久久国产99| 日韩av字幕| 久久久久久亚洲精品美女| 国产精品v亚洲精品v日韩精品| 91精品综合| 999国产精品999久久久久久| 欧美在线亚洲综合一区| 久久午夜视频| 国产视频一区二区在线播放| 成人国产精品久久| 久久婷婷激情| 亚洲欧美日韩国产综合精品二区| 麻豆国产精品一区二区三区| 欧美日本久久| 久久三级毛片| 欧洲亚洲一区二区三区| 黄色国产精品| 亚洲欧洲日韩| 国产一区二区三区亚洲| 蜜桃tv一区二区三区| 综合干狼人综合首页| 欧美久久一区二区三区| 国产精品久久久网站| 成人免费电影网址| 日韩精选在线| 福利精品一区| 国产视频一区三区| 久久99精品久久久野外观看| 激情欧美丁香| 久久高清国产| 韩日一区二区| 久久国产精品久久久久久电车| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 久久精品九色| 国产v综合v| 日本一不卡视频| 日韩免费高清| 日韩欧美高清一区二区三区| 精品欠久久久中文字幕加勒比| 日韩国产精品久久久久久亚洲| 午夜国产一区二区| 91精品国产一区二区在线观看| 免费人成精品欧美精品| 日韩精品亚洲专区| 在线天堂资源www在线污| 免费在线观看视频一区| 国产精品国产一区| 快she精品国产999| 国产不卡人人| 青青国产精品| 国精品一区二区| 国产精品一区二区三区av| 激情偷拍久久| 国产一区二区三区网| 91九色精品| 卡一精品卡二卡三网站乱码| 噜噜噜久久亚洲精品国产品小说| 国产视频一区免费看| 69堂免费精品视频在线播放| 国产精品久一| 热久久国产精品| www.com.cn成人| 国产精品美女午夜爽爽| 视频一区二区中文字幕| 欧洲一级精品| 精品一区二区三区视频在线播放| 国产欧美一区二区三区米奇| 精品日韩视频| 国产精品v日韩精品v欧美精品网站 | 精品免费av| 综合色一区二区| 激情五月综合| 精品国产免费人成网站| 国产欧美日韩精品高清二区综合区| 午夜性色一区二区三区免费视频| 在线日韩成人| 日韩精品永久网址| 国产精品99久久免费| 亚洲综合婷婷| 蜜桃成人av| 热三久草你在线| 精品国产成人| 国产精品一区二区精品视频观看 | 九色精品91| 福利一区视频| 风间由美中文字幕在线看视频国产欧美| 国产精品久久久久久久久久10秀 | 日本特黄久久久高潮| 久久精品国产大片免费观看| 亚洲精品影视| 一本一道久久a久久精品蜜桃| 日韩精品一区第一页| 麻豆精品在线播放| 欧美一区不卡| 综合激情一区| 国产在线欧美| 日韩一区三区| 欧美激情视频一区二区三区免费 | 国产美女视频一区二区| 激情综合激情| 亚洲韩日在线| 大香伊人久久精品一区二区| 日韩av中文字幕一区二区 | 91久久中文| 国产精品一区毛片| 国产九九精品| 亚洲精品美女91| 婷婷成人基地| 亚洲美女久久精品| 麻豆精品视频在线观看| 欧美欧美黄在线二区| 日韩午夜电影| 欧美香蕉视频| 欧美日韩一区二区三区不卡视频 | 成人精品亚洲| 亚洲精品大片| 欧美专区18| 香蕉精品视频在线观看| 鲁鲁在线中文| 久久精品三级| 国产精品最新自拍| 日韩黄色av| 亚洲精品中文字幕99999| 午夜欧美精品| 亚洲激情五月| 美女精品一区| 电影亚洲精品噜噜在线观看| 久久精品国产一区二区| 91福利精品在线观看| 亚洲精品精选| 亚洲三级av| 亚洲精品精选| 亚洲精品在线国产| 国产探花在线精品| 91精品麻豆| 欧美一区自拍| 国产剧情一区二区在线观看| 91精品国产自产在线丝袜啪| 日本三级亚洲精品| 精品一区二区三区视频在线播放| 欧美国产中文高清| 青草av.久久免费一区| 午夜视频一区二区在线观看| 日韩制服丝袜av| 丝瓜av网站精品一区二区| 欧美成人国产| re久久精品视频| 亚洲女人av| 欧美精品观看| 国产精品片aa在线观看| 国产精品美女在线观看直播| 国产日韩一区二区三区在线| 奇米亚洲欧美| 国产日韩亚洲欧美精品| 国产精品久久久久av蜜臀| 精品国产网站| 精品久久不卡| 亚洲一级少妇| 亚洲福利精品| 美日韩精品视频| 综合在线一区| 啪啪亚洲精品| 麻豆视频一区二区| 精品视频一区二区三区四区五区| 亚洲高清av| 免费av一区二区三区四区| 99国产精品视频免费观看一公开| 蜜臀av一区二区在线免费观看| 四虎精品一区二区免费| 亚洲性视频在线| 91嫩草精品| 日韩欧美高清一区二区三区| 国产欧美日韩| 亚洲黄色中文字幕| 国产精品女主播一区二区三区| 日韩av在线中文字幕| av中文资源在线资源免费观看| 视频一区视频二区中文| 免费成人性网站| 日本综合精品一区| 久久精品国产一区二区| 久久国产亚洲精品| 亚洲青青久久| 中文在线а√天堂|