彈出模態(tài)框,常用于消息提示、消息確認,或在當前頁面內完成特定的交互操作,支持函數調用和組件調用兩種方式。
Dialog 是一個函數,調用后會直接在頁面中彈出相應的模態(tài)框。
import { Dialog } from 'vant';
Dialog({ message: '提示' });
通過組件調用 Dialog 時,可以通過下面的方式進行注冊:
import { createApp } from 'vue';
import { Dialog } from 'vant';
// 全局注冊
const app = createApp();
app.use(Dialog);
// 局部注冊
export default {
components: {
[Dialog.Component.name]: Dialog.Component,
},
};
用于提示一些消息,只包含一個確認按鈕。
Dialog.alert({
title: '標題',
message: '彈窗內容',
}).then(() => {
// on close
});
Dialog.alert({
message: '彈窗內容',
}).then(() => {
// on close
});
用于確認消息,包含取消和確認按鈕。
Dialog.confirm({
title: '標題',
message: '彈窗內容',
})
.then(() => {
// on confirm
})
.catch(() => {
// on cancel
});
將 theme 選項設置為 round-button 可以展示圓角按鈕風格的彈窗。
Dialog.alert({
title: '標題',
message: '彈窗內容',
theme: 'round-button',
}).then(() => {
// on close
});
Dialog.alert({
message: '彈窗內容',
theme: 'round-button',
}).then(() => {
// on close
});
通過 beforeClose 屬性可以傳入一個回調函數,在彈窗關閉前進行特定操作。
const beforeClose = (action) =>
new Promise((resolve) => {
setTimeout(() => {
if (action === 'confirm') {
resolve(true);
} else {
// 攔截取消操作
resolve(false);
}
}, 1000);
});
Dialog.confirm({
title: '標題',
message: '彈窗內容',
beforeClose,
});
通過 app.use 全局注冊 Dialog 組件后,會自動在 app 的所有子組件上掛載 $dialog 方法,在所有組件內部都可以直接調用此方法。
export default {
mounted() {
this.$dialog.alert({
message: '彈窗內容',
});
},
};
Tips: 由于 setup 選項中無法訪問 this,因此不能使用上述方式,請通過 import 引入。
如果需要在彈窗內嵌入組件或其他自定義內容,可以使用組件調用的方式。
<van-dialog v-model:show="show" title="標題" show-cancel-button>
<img src="https://img.yzcdn.cn/vant/apple-3.jpg" rel="external nofollow" />
</van-dialog>
import { ref } from 'vue';
export default {
setup() {
const show = ref(false);
return { show };
},
};
方法名 | 說明 | 參數 | 返回值 |
---|---|---|---|
Dialog | 展示彈窗 | options: DialogOptions | Promise<void>
|
Dialog.alert | 展示消息提示彈窗 | options: DialogOptions | Promise<void>
|
Dialog.confirm | 展示消息確認彈窗 | options: DialogOptions | Promise<void>
|
Dialog.setDefaultOptions | 修改默認配置,對所有 Dialog 生效 | options: DialogOptions | void
|
Dialog.resetDefaultOptions | 重置默認配置,對所有 Dialog 生效 | - | void
|
Dialog.close | 關閉彈窗 | - | void
|
通過函數調用 Dialog 時,支持傳入以下選項:
參數 | 說明 | 類型 | 默認值 |
---|---|---|---|
title | 標題 | string | - |
width | 彈窗寬度,默認單位為 px
|
number | string | 320px
|
message | 文本內容,支持通過 \n 換行 |
string | () => JSX.ELement | - |
messageAlign | 內容對齊方式,可選值為 left right
|
string | center
|
theme | 樣式風格,可選值為 round-button
|
string | default
|
className | 自定義類名 | string | Array | object | - |
showConfirmButton | 是否展示確認按鈕 | boolean | true
|
showCancelButton | 是否展示取消按鈕 | boolean | false
|
confirmButtonText | 確認按鈕文案 | string | 確認
|
confirmButtonColor | 確認按鈕顏色 | string | #ee0a24
|
cancelButtonText | 取消按鈕文案 | string | 取消
|
cancelButtonColor | 取消按鈕顏色 | string | black
|
overlay | 是否展示遮罩層 | boolean | true
|
overlayClass | 自定義遮罩層類名 | string | Array | object | - |
overlayStyle | 自定義遮罩層樣式 | object | - |
closeOnPopstate | 是否在頁面回退時自動關閉 | boolean | true
|
closeOnClickOverlay | 是否在點擊遮罩層后關閉彈窗 | boolean | false
|
lockScroll | 是否鎖定背景滾動 | boolean | true
|
allowHtml | 是否允許 message 內容中渲染 HTML | boolean | false
|
beforeClose | 關閉前的回調函數,返回 false 可阻止關閉,支持返回 Promise |
(action: string) => boolean | Promise<boolean> | - |
transition | 動畫類名,等價于 transition 的 name 屬性 |
string | - |
teleport | 指定掛載的節(jié)點,等同于 Teleport 組件的 to 屬性 | string | Element | body
|
通過組件調用 Dialog 時,支持以下 Props:
參數 | 說明 | 類型 | 默認值 |
---|---|---|---|
v-model:show | 是否顯示彈窗 | boolean | - |
title | 標題 | string | - |
width | 彈窗寬度,默認單位為 px
|
number | string | 320px
|
message | 文本內容,支持通過 \n 換行 |
string | () => JSX.ELement | - |
message-align | 內容水平對齊方式,可選值為 left right
|
string | center
|
theme | 樣式風格,可選值為 round-button
|
string | default
|
show-confirm-button | 是否展示確認按鈕 | boolean | true
|
show-cancel-button | 是否展示取消按鈕 | boolean | false
|
confirm-button-text | 確認按鈕文案 | string | 確認
|
confirm-button-color | 確認按鈕顏色 | string | #ee0a24
|
cancel-button-text | 取消按鈕文案 | string | 取消
|
cancel-button-color | 取消按鈕顏色 | string | black
|
overlay | 是否展示遮罩層 | boolean | true
|
overlay-class | 自定義遮罩層類名 | string | - |
overlay-style | 自定義遮罩層樣式 | object | - |
close-on-popstate | 是否在頁面回退時自動關閉 | boolean | true
|
close-on-click-overlay | 是否在點擊遮罩層后關閉彈窗 | boolean | false
|
lazy-render | 是否在顯示彈層時才渲染節(jié)點 | boolean | true
|
lock-scroll | 是否鎖定背景滾動 | boolean | true
|
allow-html | 是否允許 message 內容中渲染 HTML | boolean | false
|
before-close | 關閉前的回調函數,返回 false 可阻止關閉,支持返回 Promise |
(action: string) => boolean | Promise<boolean> | - |
transition | 動畫類名,等價于 transition 的 name 屬性 |
string | - |
teleport | 指定掛載的節(jié)點,等同于 Teleport 組件的 to 屬性 | string | Element | - |
通過組件調用 Dialog 時,支持以下事件:
事件 | 說明 | 回調參數 |
---|---|---|
confirm | 點擊確認按鈕時觸發(fā) | - |
cancel | 點擊取消按鈕時觸發(fā) | - |
open | 打開彈窗時觸發(fā) | - |
close | 關閉彈窗時觸發(fā) | - |
opened | 打開彈窗且動畫結束后觸發(fā) | - |
closed | 關閉彈窗且動畫結束后觸發(fā) | - |
通過組件調用 Dialog 時,支持以下插槽:
名稱 | 說明 |
---|---|
default | 自定義內容 |
title | 自定義標題 |
footer v3.0.10
|
自定義底部按鈕區(qū)域 |
組件提供了下列 CSS 變量,可用于自定義樣式,使用方法請參考 ConfigProvider 組件。
名稱 | 默認值 | 描述 |
---|---|---|
--van-dialog-width | 320px | - |
--van-dialog-small-screen-width | 90% | - |
--van-dialog-font-size | var(--van-font-size-lg) | - |
--van-dialog-transition | var(--van-animation-duration-base) | - |
--van-dialog-border-radius | 16px | - |
--van-dialog-background-color | var(--van-white) | - |
--van-dialog-header-font-weight | var(--van-font-weight-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-danger-color) | - |
將 closeOnPopstate 屬性設置為 false 即可。
Dialog.alert({
title: '標題',
message: '彈窗內容',
closeOnPopstate: false,
}).then(() => {
// on close
});
請注意 Dialog 是一個函數,Dialog.Component 才是 Dialog 對應的組件。JSX 調用彈窗的正確姿勢如下:
export default {
setup() {
const show = ref(false);
return () => <Dialog.Component v-model={[show, 'show']} />;
},
};
更多建議: