本文小編為大家詳細(xì)介紹“Vue3+hook如何實(shí)現(xiàn)彈窗組件”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Vue3+hook如何實(shí)現(xiàn)彈窗組件”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
成都創(chuàng)新互聯(lián)公司的客戶(hù)來(lái)自各行各業(yè),為了共同目標(biāo),我們?cè)诠ぷ魃厦芮信浜?,從?chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對(duì)我們的要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。專(zhuān)業(yè)領(lǐng)域包括網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、電商網(wǎng)站開(kāi)發(fā)、微信營(yíng)銷(xiāo)、系統(tǒng)平臺(tái)開(kāi)發(fā)。
如果是普通彈窗使用的話,直接使用el-dialog
組件已經(jīng)足夠了
但我還是一個(gè)比較愛(ài)折騰的人,我們先看看官方dialog
文檔有什么可以添加的功能
...
大概看了一下,我打算封裝一下功能
提供全屏操作按鈕(右上角)
默認(rèn)提供“確認(rèn)”,“關(guān)閉”按鈕
內(nèi)部添加Loading
效果
確定了要封裝的功能之后,先來(lái)一個(gè)簡(jiǎn)單的dialog
組件。
把雙向綁定處理一下,這樣外部就可以直接通過(guò)v-model
直接控制彈窗了。
這里使用到圖標(biāo)庫(kù)@element-plus/icons-vue
如沒(méi)有安裝,請(qǐng)執(zhí)行npm install @element-plus/icons-vue
使用el-dialog
提供的header
插槽,將全屏圖表和關(guān)閉圖標(biāo)放置到右上角中。給el-dialog
傳遞show-close
屬性關(guān)閉默認(rèn)圖標(biāo)。
彈窗的標(biāo)題文字內(nèi)容通過(guò)props
進(jìn)行傳遞,默認(rèn)為空(''
)
我們看看現(xiàn)在頭部的效果(這里沒(méi)傳入標(biāo)題,默認(rèn)為''
)
現(xiàn)在這個(gè)按鈕只有樣式效果,還沒(méi)有寫(xiě)上對(duì)應(yīng)的功能 ~
給他們先綁定上對(duì)應(yīng)的事件和指令
NICE 頭部功能也就完成了
接下來(lái),再處理下底部?jī)?nèi)容,默認(rèn)提供兩個(gè)按鈕,分別是“確定”和“關(guān)閉”,這個(gè)名稱(chēng)也是可以通過(guò)props
屬性修改的。
兩個(gè)按鈕綁定點(diǎn)擊事件,向外發(fā)送不同的事件。
又搞定了一部分了,就剩下Content了 ~
彈窗內(nèi)容通過(guò)默認(rèn)插槽的方式傳入進(jìn)來(lái),在外層的div
元素上添加v-loading
標(biāo)簽,實(shí)現(xiàn)加載態(tài)。
如果你想整個(gè)彈窗實(shí)現(xiàn)loading效果,請(qǐng)把v-loading移到最外層元素即可。 注意不能是el-dialog元素上,否則無(wú)法實(shí)現(xiàn) 可能是el-dialog使用了teleport組件,導(dǎo)致v-loading無(wú)法正常工作。 等有空研究一下 ~
試試看中間的loading
效果
在el-dialog
組件提供了很多個(gè)props
屬性供用戶(hù)選擇,但我們現(xiàn)在封裝的dialog
組件只使用到了一小部分props
屬性。當(dāng)用戶(hù)想要使用其他的props
屬性時(shí)該怎么辦?
例如使用width屬性時(shí),難道要在我們封裝的組件中接收props.width
再傳遞給
組件嗎?
不不不,還有另外一種方法,還記得剛剛在做全屏操作的時(shí)候使用到的useAttrs
輔助函數(shù)嗎
它可以獲取當(dāng)前組件傳遞進(jìn)來(lái)的屬性。有了這個(gè)方法之后,再配合并即可將外部傳遞進(jìn)來(lái)的函數(shù)再傳遞到el-dialog
組件上面啦
為了避免內(nèi)部傳遞的props被覆蓋掉,
v-bind="attrs"
需要放在最前面
在使用時(shí),可能會(huì)給before-close
屬性傳遞一個(gè)函數(shù),但到了后面被內(nèi)部的handleClose
方法給覆蓋掉了。
解決方案是在handleClose
函數(shù)中,獲取attrs.['before-close']
屬性,如果類(lèi)型是函數(shù)函數(shù),先執(zhí)行它。
const handleClose = () => {
if (
Reflect.has(attrs, "before-close") &&
typeof attrs["before-close"] === "function"
) {
attrs["before-close"]();
}
emits("close");
};
有關(guān)于el-dialog
組件的封裝就到這里了
利用Vue composition Api
再封裝一下在使用el-dialog
組件狀態(tài)的管理hook
簡(jiǎn)單處理顯示和加載態(tài)開(kāi)關(guān)的hook
import { ref } from "vue";
export default function useDialog() {
const visible = ref(false);
const loading = ref(false);
const openDialog = () => (visible.value = true);
const closeDialog = () => (visible.value = false);
const openLoading = () => (loading.value = true);
const closeLoading = () => (loading.value = false);
return {
visible,
loading,
openDialog,
closeDialog,
openLoading,
closeLoading,
};
}
DialogCmp1
針對(duì)開(kāi)發(fā)管理后臺(tái)彈窗狀態(tài)封裝的一個(gè)hook
,搭配下面的useDialogWithForm
使用。
export enum MODE {
ADD, EDIT,
}
import { ref } from "vue";
import { MODE } from "./types";
export default function useDialogState() {
const mode = ref
針對(duì)表單彈窗組件封裝的hooks
,接收一個(gè)formRef
實(shí)例,負(fù)責(zé)控制彈窗內(nèi)標(biāo)題及清空表單中的校驗(yàn)結(jié)果,減少多余的代碼 ~
import { FormInstance } from "element-plus";
import { Ref, ref } from "vue";
import { MODE } from "./types";
import useDialogState from "./useDialogState";
export default function useDialogFn(
formInstance: Ref
讀到這里,這篇“Vue3+hook如何實(shí)現(xiàn)彈窗組件”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。