彈出模態(tài)框,常用于消息提示、消息確認(rèn),或在當(dāng)前頁(yè)面內(nèi)完成特定的交互操作。支持組件調(diào)用和函數(shù)調(diào)用兩種方式。
通過(guò)以下方式來(lái)全局注冊(cè)組件,更多注冊(cè)方式請(qǐng)參考組件注冊(cè)。
import { createApp } from 'vue';
import { Dialog } from 'vant';
const app = createApp();
app.use(Dialog);
為了便于使用 ?Dialog
?,Vant 提供了一系列輔助函數(shù),通過(guò)輔助函數(shù)可以快速喚起全局的彈窗組件。
比如使用 ?showDialog
? 函數(shù),調(diào)用后會(huì)直接在頁(yè)面中渲染對(duì)應(yīng)的彈出框。
import { showDialog } from 'vant';
showDialog({ message: '提示' });
用于提示一些消息,只包含一個(gè)確認(rèn)按鈕。
import { showDialog } from 'vant';
showDialog({
title: '標(biāo)題',
message: '代碼是寫出來(lái)給人看的,附帶能在機(jī)器上運(yùn)行。',
}).then(() => {
// on close
});
showDialog({
message: '生命遠(yuǎn)不止連軸轉(zhuǎn)和忙到極限,人類的體驗(yàn)遠(yuǎn)比這遼闊、豐富得多。',
}).then(() => {
// on close
});
用于確認(rèn)消息,包含取消和確認(rèn)按鈕。
import { showConfirmDialog } from 'vant';
showConfirmDialog({
title: '標(biāo)題',
message:
'如果解決方法是丑陋的,那就肯定還有更好的解決方法,只是還沒(méi)有發(fā)現(xiàn)而已。',
})
.then(() => {
// on confirm
})
.catch(() => {
// on cancel
});
將 theme 選項(xiàng)設(shè)置為 ?round-button
? 可以展示圓角按鈕風(fēng)格的彈窗。
import { showDialog } from 'vant';
showDialog({
title: '標(biāo)題',
message: '代碼是寫出來(lái)給人看的,附帶能在機(jī)器上運(yùn)行。',
theme: 'round-button',
}).then(() => {
// on close
});
showDialog({
message: '生命遠(yuǎn)不止連軸轉(zhuǎn)和忙到極限,人類的體驗(yàn)遠(yuǎn)比這遼闊、豐富得多。',
theme: 'round-button',
}).then(() => {
// on close
});
通過(guò) ?beforeClose
? 屬性可以傳入一個(gè)回調(diào)函數(shù),在彈窗關(guān)閉前進(jìn)行特定操作。
import { showConfirmDialog } from 'vant';
const beforeClose = (action) =>
new Promise((resolve) => {
setTimeout(() => {
if (action === 'confirm') {
resolve(true);
} else {
// 攔截取消操作
resolve(false);
}
}, 1000);
});
showConfirmDialog({
title: '標(biāo)題',
message:
'如果解決方法是丑陋的,那就肯定還有更好的解決方法,只是還沒(méi)有發(fā)現(xiàn)而已。',
beforeClose,
});
如果需要在 Dialog 內(nèi)嵌入組件或其他自定義內(nèi)容,可以直接使用 Dialog 組件,并使用默認(rèn)插槽進(jìn)行定制。使用前需要通過(guò) ?app.use
? 等方式注冊(cè)組件。
<van-dialog v-model:show="show" title="標(biāo)題" show-cancel-button>
<img src="https://fastly.jsdelivr.net/npm/@vant/assets/apple-3.jpeg" rel="external nofollow" />
</van-dialog>
import { ref } from 'vue';
export default {
setup() {
const show = ref(false);
return { show };
},
};
Vant 中導(dǎo)出了以下 Dialog 相關(guān)的輔助函數(shù):
方法名 | 說(shuō)明 | 參數(shù) | 返回值 |
---|---|---|---|
showDialog | 展示彈窗 | options: DialogOptions | Promise<void>
|
showConfirmDialog | 展示消息確認(rèn)彈窗 | options: DialogOptions | Promise<void>
|
closeDialog | 關(guān)閉彈窗 | - | void
|
setDialogDefaultOptions | 修改默認(rèn)配置,影響所有的 showDialog 調(diào)用 |
options: DialogOptions | void
|
resetDialogDefaultOptions | 重置默認(rèn)配置,影響所有的 showDialog 調(diào)用 |
- | void
|
調(diào)用 ?showDialog
? 等方法時(shí),支持傳入以下選項(xiàng):
參數(shù) | 說(shuō)明 | 類型 | 默認(rèn)值 |
---|---|---|---|
title | 標(biāo)題 | string | - |
width | 彈窗寬度,默認(rèn)單位為 px
|
number | string | 320px
|
message | 文本內(nèi)容,支持通過(guò) \n 換行 |
string | () => JSX.ELement | - |
messageAlign | 內(nèi)容對(duì)齊方式,可選值為 left right
|
string | center
|
theme | 樣式風(fēng)格,可選值為 round-button
|
string | default
|
className | 自定義類名 | string | Array | object | - |
showConfirmButton | 是否展示確認(rèn)按鈕 | boolean | true
|
showCancelButton | 是否展示取消按鈕 | boolean | false
|
confirmButtonText | 確認(rèn)按鈕文案 | string | 確認(rèn)
|
confirmButtonColor | 確認(rèn)按鈕顏色 | string | #ee0a24
|
confirmButtonDisabled v3.5.0
|
是否禁用確認(rèn)按鈕 | boolean | false
|
cancelButtonText | 取消按鈕文案 | string | 取消
|
cancelButtonColor | 取消按鈕顏色 | string | black
|
cancelButtonDisabled v3.5.0
|
是否禁用取消按鈕 | boolean | false
|
overlay | 是否展示遮罩層 | boolean | true
|
overlayClass | 自定義遮罩層類名 | string | Array | object | - |
overlayStyle | 自定義遮罩層樣式 | object | - |
closeOnPopstate | 是否在頁(yè)面回退時(shí)自動(dòng)關(guān)閉 | boolean | true
|
closeOnClickOverlay | 是否在點(diǎn)擊遮罩層后關(guān)閉彈窗 | boolean | false
|
lockScroll | 是否鎖定背景滾動(dòng) | boolean | true
|
allowHtml | 是否允許 message 內(nèi)容中渲染 HTML | boolean | false
|
beforeClose | 關(guān)閉前的回調(diào)函數(shù),返回 false 可阻止關(guān)閉,支持返回 Promise |
(action: string) => boolean | Promise<boolean> | - |
transition | 動(dòng)畫類名,等價(jià)于 transition 的 name 屬性 |
string | - |
teleport | 指定掛載的節(jié)點(diǎn),等同于 Teleport 組件的 to 屬性 | string | Element | body
|
通過(guò)組件調(diào)用 ?Dialog
? 時(shí),支持以下 Props:
參數(shù) | 說(shuō)明 | 類型 | 默認(rèn)值 |
---|---|---|---|
v-model:show | 是否顯示彈窗 | boolean | - |
title | 標(biāo)題 | string | - |
width | 彈窗寬度,默認(rèn)單位為 px
|
number | string | 320px
|
message | 文本內(nèi)容,支持通過(guò) \n 換行 |
string | () => JSX.Element | - |
message-align | 內(nèi)容水平對(duì)齊方式,可選值為 left right justify
|
string | center
|
theme | 樣式風(fēng)格,可選值為 round-button
|
string | default
|
show-confirm-button | 是否展示確認(rèn)按鈕 | boolean | true
|
show-cancel-button | 是否展示取消按鈕 | boolean | false
|
confirm-button-text | 確認(rèn)按鈕文案 | string | 確認(rèn)
|
confirm-button-color | 確認(rèn)按鈕顏色 | string | #ee0a24
|
confirm-button-disabled v3.5.0
|
是否禁用確認(rèn)按鈕 | boolean | false
|
cancel-button-text | 取消按鈕文案 | string | 取消
|
cancel-button-color | 取消按鈕顏色 | string | black
|
cancel-button-disabled v3.5.0
|
是否禁用取消按鈕 | boolean | false
|
z-index | 將彈窗的 z-index 層級(jí)設(shè)置為一個(gè)固定值 | number | string | 2000+
|
overlay | 是否展示遮罩層 | boolean | true
|
overlay-class | 自定義遮罩層類名 | string | - |
overlay-style | 自定義遮罩層樣式 | object | - |
close-on-popstate | 是否在頁(yè)面回退時(shí)自動(dòng)關(guān)閉 | boolean | true
|
close-on-click-overlay | 是否在點(diǎn)擊遮罩層后關(guān)閉彈窗 | boolean | false
|
lazy-render | 是否在顯示彈層時(shí)才渲染節(jié)點(diǎn) | boolean | true
|
lock-scroll | 是否鎖定背景滾動(dòng) | boolean | true
|
allow-html | 是否允許 message 內(nèi)容中渲染 HTML | boolean | false
|
before-close | 關(guān)閉前的回調(diào)函數(shù),返回 false 可阻止關(guān)閉,支持返回 Promise |
(action: string) => boolean | Promise<boolean> | - |
transition | 動(dòng)畫類名,等價(jià)于 transition 的 name 屬性 |
string | - |
teleport | 指定掛載的節(jié)點(diǎn),等同于 Teleport 組件的 to 屬性 | string | Element | - |
通過(guò)組件調(diào)用 ?Dialog
? 時(shí),支持以下事件:
事件 | 說(shuō)明 | 回調(diào)參數(shù) |
---|---|---|
confirm | 點(diǎn)擊確認(rèn)按鈕時(shí)觸發(fā) | - |
cancel | 點(diǎn)擊取消按鈕時(shí)觸發(fā) | - |
open | 打開(kāi)彈窗時(shí)觸發(fā) | - |
close | 關(guān)閉彈窗時(shí)觸發(fā) | - |
opened | 打開(kāi)彈窗且動(dòng)畫結(jié)束后觸發(fā) | - |
closed | 關(guān)閉彈窗且動(dòng)畫結(jié)束后觸發(fā) | - |
通過(guò)組件調(diào)用 ?Dialog
? 時(shí),支持以下插槽:
名稱 | 說(shuō)明 |
---|---|
default | 自定義內(nèi)容 |
title | 自定義標(biāo)題 |
footer v3.0.11
|
自定義底部按鈕區(qū)域 |
組件導(dǎo)出以下類型定義:
import type {
DialogProps,
DialogTheme,
DialogMessage,
DialogOptions,
DialogMessageAlign,
} from 'vant';
組件提供了下列 CSS 變量,可用于自定義樣式,使用方法請(qǐng)參考 ConfigProvider 組件。
名稱 | 默認(rèn)值 | 描述 |
---|---|---|
--van-dialog-width | 320px | - |
--van-dialog-small-screen-width | 90% | - |
--van-dialog-font-size | var(--van-font-size-lg) | - |
--van-dialog-transition | var(--van-duration-base) | - |
--van-dialog-radius | 16px | - |
--van-dialog-background | var(--van-background-2) | - |
--van-dialog-header-font-weight | var(--van-font-bold) | - |
--van-dialog-header-line-height | 24px | - |
--van-dialog-header-padding-top | 26px | - |
--van-dialog-header-isolated-padding | var(--van-padding-lg) 0 | - |
--van-dialog-message-padding | var(--van-padding-lg) | - |
--van-dialog-message-font-size | var(--van-font-size-md) | - |
--van-dialog-message-line-height | var(--van-line-height-md) | - |
--van-dialog-message-max-height | 60vh | - |
--van-dialog-has-title-message-text-color | var(--van-gray-7) | - |
--van-dialog-has-title-message-padding-top | var(--van-padding-xs) | - |
--van-dialog-button-height | 48px | - |
--van-dialog-round-button-height | 36px | - |
--van-dialog-confirm-button-text-color | var(--van-primary-color) | - |
如果引用 ?showDialog
? 方法時(shí)出現(xiàn)以下報(bào)錯(cuò),說(shuō)明項(xiàng)目中使用了 ?babel-plugin-import
? 插件,導(dǎo)致代碼被錯(cuò)誤編譯。
These dependencies were not found:
* vant/es/show-dialog in ./src/xxx.js
* vant/es/show-dialog/style in ./src/xxx.js
Vant 從 4.0 版本開(kāi)始不再支持 ?babel-plugin-import
? 插件,請(qǐng)參考 遷移指南 移除該插件。
將 ?closeOnPopstate
? 屬性設(shè)置為 false 即可。
Dialog.alert({
title: '標(biāo)題',
message: '彈窗內(nèi)容',
closeOnPopstate: false,
}).then(() => {
// on close
});
更多建議: