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

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

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

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

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

沒(méi)有Teleport

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

有Teleport

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

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

2.Teleport的基本用法

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

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

如果我們?cè)诖a中將Teleport要掛載的DOM寫(xiě)死,那么每創(chuàng)建一個(gè)全局式組件,就需要有一個(gè)DOM節(jié)點(diǎn),會(huì)越來(lái)越多,并且一直存在,這樣的寫(xiě)法不是很優(yōu)雅。比較好的解決方案就是:

在創(chuàng)建組件的時(shí)候,動(dòng)態(tài)創(chuàng)建一個(gè)dom節(jié)點(diǎn)document.createElement(), 并添加到body中,document.body.appendChild(), 在組件卸載的時(shí)候銷(xiāo)毀這個(gè)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,在每一個(gè)組件內(nèi)部都寫(xiě)這么一段代碼,實(shí)在有點(diǎn)冗余,vue3使我們能夠很方便的將邏輯功能提取出來(lái),從而達(dá)到邏輯復(fù)用的目的。

我們?cè)趕rc-hooks文件夾下創(chuàng)建useDOMCreate.ts文件,來(lái)封裝這一塊邏輯

// 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.實(shí)現(xiàn)Modal組件

具體封裝Modal組件的細(xì)節(jié)這里就不講啦,也沒(méi)有什么復(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)要?jiǎng)h除這篇文章嗎?</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實(shí)現(xiàn)Modal組件的詳細(xì)內(nèi)容,更多關(guān)于vue Teleport實(shí)現(xiàn)Modal組件的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
神马午夜在线视频| 欧美精品自拍| 婷婷精品在线| 日韩精品五月天| 婷婷精品在线观看| 欧美日韩在线精品一区二区三区激情综合 | 日韩精品中文字幕吗一区二区| 亚洲免费网址| 蜜桃视频在线观看一区二区| 男女激情视频一区| 亚洲精品看片| 国产精品一区二区三区四区在线观看| 国产精品日本一区二区三区在线| 精品中国亚洲| 久久激情一区| 在线精品国产亚洲| 日本伊人午夜精品| 国产高清精品二区| 日本久久综合| 在线日韩中文| 免费在线成人网| 国产亚洲电影| 波多野结衣久久精品| 久久黄色影院| 婷婷成人av| 老司机免费视频一区二区三区| 成人在线免费观看网站| 99久久亚洲精品蜜臀| 午夜亚洲精品| 国产精品chinese| 99成人超碰| 中文字幕一区二区三区日韩精品| 国产一精品一av一免费爽爽| 九九久久国产| 136国产福利精品导航网址| 亚洲一区区二区| 国产精品流白浆在线观看| 欧美成人a交片免费看| 美女网站久久| 国产精久久久| 在线一区免费| 国产乱子精品一区二区在线观看| 成人av三级| 亚洲性视频在线| 久久久久久自在自线| 日韩一级网站| 国产精品久久久久久久久久白浆| 久久精品导航| 日韩欧美中文字幕电影| 国产91欧美| 亚洲色图网站| а√在线中文在线新版| 亚洲色图网站| 久久精品亚洲人成影院| 日韩av一区二区三区四区| 日韩精品专区| 国产精品一区二区美女视频免费看| 91亚洲国产高清| 亚洲精品影视| 日韩一区二区在线免费| 欧美日韩1区| 婷婷色综合网| 国内在线观看一区二区三区| 99成人在线| 久久婷婷国产| 伊人国产精品| 激情欧美日韩一区| 欧美激情麻豆| 亚洲小说春色综合另类电影| 久久男人天堂| 国产伦精品一区二区三区视频| 欧美在线亚洲| 国产拍在线视频| 欧美日韩一区二区三区四区在线观看 | 亚洲va在线| 国产精品资源| 中文字幕亚洲影视| 日本精品影院| 国模大尺度视频一区二区| 中文字幕一区二区三区四区久久| 亚洲www免费| 国产精品视频一区二区三区四蜜臂| 亚洲精品1区| 午夜av不卡| 美女视频黄久久| 日韩综合小视频| 午夜欧美精品久久久久久久| 精品视频在线观看网站| 日韩不卡一区二区三区 | 蜜臀久久99精品久久久久宅男| 欧美sss在线视频| 国产夫妻在线| 久久中文在线| 久久精品xxxxx| 在线精品福利| 三级在线观看一区二区| 久久国产亚洲精品| 日韩av免费大片| 你懂的网址国产 欧美| 婷婷精品久久久久久久久久不卡| 亚洲作爱视频| 激情久久婷婷| 99久久婷婷| 久久精品动漫| 久久中文字幕二区| 日韩免费在线| 日韩欧美三级| 日韩精品麻豆| 91精品一区二区三区综合在线爱 | 日本大胆欧美人术艺术动态| 久久精品99久久无色码中文字幕| 精品成人免费一区二区在线播放| 伊人网在线播放| 色婷婷亚洲mv天堂mv在影片| 久久精品九色| 日韩av二区| 亚洲天堂av影院| 麻豆精品蜜桃| 亚洲午夜91| 黄色不卡一区| 亚洲综合国产| 美女精品在线观看| 亚洲日本免费电影| 欧美一级一区| 欧美天堂一区二区| 国产剧情一区| 麻豆91精品视频| 97欧美在线视频| 在线视频观看日韩| 香蕉视频成人在线观看| 一区二区国产在线观看| 亚洲精品日本| 国产探花在线精品| 精品视频网站| 欧美三级精品| 国产视频一区三区| 日本亚洲最大的色成网站www| 日本亚洲视频| 国产精品亚洲欧美| 精品久久在线| 久久精品91| 丝袜美腿亚洲一区二区图片| 日日夜夜免费精品视频| 国产精品mm| 日韩伦理在线一区| 欧美另类综合| 日韩中文字幕无砖| 精品国产一区二区三区2021| 久久蜜桃资源一区二区老牛| 在线综合欧美| 久久黄色影视| 欧洲一区二区三区精品| 欧美天堂亚洲电影院在线观看| 久久亚洲二区| 青草国产精品| 国产成人免费精品| 亚洲高清毛片| 亚洲精品日韩久久| 国际精品欧美精品| 99视频一区| 久久精品72免费观看| 韩国久久久久久| 老牛影视一区二区三区| 国产亚洲一区| 一本大道色婷婷在线| 丝袜美腿亚洲一区二区图片| 国产精品xvideos88| 久久婷婷av| 日韩免费精品| 精品视频一区二区三区四区五区 | 国产一区亚洲| 日本在线视频一区二区| 国产精品二区不卡| 久久性天堂网| 国产中文字幕一区二区三区| 午夜av一区| 国产精品久久免费视频| 欧美日韩一区二区三区视频播放| 午夜亚洲福利| 成人自拍av| 99视频+国产日韩欧美| 欧美偷窥清纯综合图区| 中文在线中文资源| 日韩一区免费| 欧美成人a交片免费看| 蜜桃视频一区二区三区在线观看| 国产极品嫩模在线观看91精品| 激情久久久久久| 国产精品99久久免费| 亚洲一区国产| 日韩1区2区| 日韩精品午夜视频| 国产99亚洲| 嫩呦国产一区二区三区av| 不卡在线一区二区| 国产亚洲观看| 奶水喷射视频一区| 亚洲风情在线资源| 欧美亚洲tv| 在线一区二区三区视频|