Dialog
Demos
Sizes and fullscreen
Available size/dimension variants for the ui
prop: s
/ m
/ narrow
/ medium
/ wide
/ auto
.
s
/ m
are used to specify size for internal content and will be inherited by components inside the dialog. While narrow
/ medium
/ wide
/ fullscreen
/ auto
are used to specify the dimension of the dialog itself, thus can be used together with s
/ m
.
<template>
<article>
<veui-button @click="openDialog('s')">
s
</veui-button>
<veui-button @click="openDialog('m')">
m
</veui-button>
<veui-button @click="openDialog('narrow')">
narrow
</veui-button>
<veui-button @click="openDialog('medium')">
medium
</veui-button>
<veui-button @click="openDialog('wide')">
wide
</veui-button>
<veui-button @click="openDialog('fullscreen')">
fullscreen
</veui-button>
<veui-button @click="openDialog('auto')">
auto
</veui-button>
<veui-dialog
title="System"
:ui="ui"
:open.sync="open"
>
<section>Current UI: "{{ ui }}"</section>
<section v-if="ui === 's' || ui === 'm'">
<veui-button>Button size: {{ ui }}</veui-button>
<veui-switch>{{ ui }}</veui-switch>
</section>
</veui-dialog>
</article>
</template>
<script>
import { Dialog, Button, Switch } from 'veui'
export default {
components: {
'veui-dialog': Dialog,
'veui-button': Button,
'veui-switch': Switch
},
data () {
return {
open: false,
ui: null
}
},
methods: {
openDialog (size) {
this.ui = size
this.open = true
}
}
}
</script>
<style lang="less" scoped>
.veui-button {
margin-right: 20px;
}
</style>
Modal and non-modal
<template>
<article>
<veui-button @click="modalOpen = true">
Modal
</veui-button>
<veui-button @click="nonModalOpen = true">
Non-modal
</veui-button>
<veui-dialog
title="System"
:open.sync="modalOpen"
@ok="handleModalClose(true)"
@cancel="handleModalClose"
>
Do you want to refresh the page?
</veui-dialog>
<veui-dialog
title="System"
:open.sync="nonModalOpen"
:modal="false"
@ok="handleModalClose(true)"
@cancel="handleModalClose"
>
Do you want to refresh the page?
</veui-dialog>
</article>
</template>
<script>
import { Dialog, Button } from 'veui'
export default {
components: {
'veui-dialog': Dialog,
'veui-button': Button
},
data () {
return {
modalOpen: false,
nonModalOpen: false
}
},
methods: {
handleModalClose (ok) {
this.modalOpen = false
if (ok) {
location.reload()
}
},
handleNonModalClose (ok) {
this.nonModalOpen = false
if (ok) {
location.reload()
}
}
}
}
</script>
<style lang="less" scoped>
.veui-button {
margin-right: 20px;
}
</style>
Customized content
<template>
<article>
<veui-button @click="simpleOpen = true">
Title & content
</veui-button>
<veui-dialog
:open.sync="simpleOpen"
title="Customized Title & Content"
@ok="simpleOpen = false"
@cancel="simpleOpen = false"
>
Customized content via <code>&lt;slot&gt;</code>.
</veui-dialog>
<veui-button @click="titleIconOpen = true">
Icon in Title
</veui-button>
<veui-dialog
:open.sync="titleIconOpen"
@ok="titleIconOpen = false"
@cancel="titleIconOpen = false"
>
<template #title>
Title with Icon <veui-icon name="flag"/>
</template>
Customized content via <code>&lt;slot&gt;</code>.
</veui-dialog>
<veui-button @click="footOpen = true">
Foot
</veui-button>
<veui-dialog
:open.sync="footOpen"
title="Customized Foot"
>
Customized content via <code>&lt;slot&gt;</code>.
<template #foot="{ close }">
<veui-button
ui="s primary"
@click="close('ok')"
>
Close
</veui-button>
</template>
</veui-dialog>
</article>
</template>
<script>
import { Dialog, Button, Icon } from 'veui'
import 'veui-theme-dls-icons/flag'
export default {
components: {
'veui-dialog': Dialog,
'veui-button': Button,
'veui-icon': Icon
},
data () {
return {
simpleOpen: false,
titleIconOpen: false,
footOpen: false
}
}
}
</script>
<style lang="less" scoped>
.veui-button {
margin-right: 20px;
}
</style>
Async support
When you want a unified process to handle all user interactions that might trigger the dialog to be closed, you can leverage the before-close
function prop. No matter the close behavior is about to be triggered by clicking “OK”/“Cancel” buttons, the close button or pressing esc, before-close
will always take over the following process. If the logic is relatively simple, you can manipulate open
prop directly to close the dialog.
<template>
<article>
<veui-button
:disabled="submitting"
@click="submitOpen = true"
>
Submit
</veui-button>
<veui-button
:disabled="saving"
@click="saveOpen = true"
>
Save
</veui-button>
<veui-dialog
title="System"
:open.sync="submitOpen"
:before-close="submit"
:closable="false"
:escapable="!submitting"
:loading="submitting"
>
Confirm to create the issue?
</veui-dialog>
<veui-dialog
title="System"
:open.sync="saveOpen"
:closable="false"
:escapable="!submitting"
>
Confirm to save the post?
<template #foot>
<veui-button
ui="primary"
:loading="saving"
@click="save('ok')"
>
OK
</veui-button>
<veui-button
:disabled="saving"
@click="save"
>
Cancel
</veui-button>
</template>
</veui-dialog>
</article>
</template>
<script>
import { Dialog, Button, toast } from 'veui'
function fakeRequest () {
return new Promise(resolve =>
setTimeout(() => {
resolve(Math.random() < 0.5)
}, 2000)
)
}
export default {
components: {
'veui-dialog': Dialog,
'veui-button': Button
},
data () {
return {
submitOpen: false,
saveOpen: false,
submitting: false,
saving: false
}
},
methods: {
submit (type) {
if (type === 'ok') {
this.submitting = true
return fakeRequest().then(success => {
this.submitting = false
if (!success) {
toast.error('Failed to create the issue. Please retry.')
return false
}
toast.success('Issue created successfully!')
})
}
},
save (type) {
if (type === 'ok') {
this.saving = true
return fakeRequest().then(success => {
this.saving = false
if (!success) {
toast.error('Failed to save the post. Please retry.')
} else {
toast.success('Post saved successfully!')
this.saveOpen = false
}
})
}
this.saveOpen = false
}
}
}
</script>
<style lang="less" scoped>
article > .veui-button {
margin-right: 20px;
}
</style>
Draggable
<template>
<article>
<veui-button @click="draggableOpen = true">
Draggable
</veui-button>
<veui-dialog
:open.sync="draggableOpen"
title="Draggable Dialog"
draggable
@ok="draggableOpen = false"
@cancel="draggableOpen = false"
>
This dialog is draggable.
</veui-dialog>
</article>
</template>
<script>
import { Dialog, Button } from 'veui'
export default {
components: {
'veui-dialog': Dialog,
'veui-button': Button
},
data () {
return {
draggableOpen: false
}
}
}
</script>
<style lang="less" scoped>
.veui-button {
margin-right: 20px;
}
</style>
Stacking order
Open both dialogs and drag one of them to make them overlap a little bit. Then when you activate one dialog, it will be displayed on top of the other one.
<template>
<article>
<veui-button @click="aOpen = true">
Dialog A
</veui-button>
<veui-dialog
:open.sync="aOpen"
title="Dialog A"
draggable
:modal="false"
@ok="aOpen = false"
@cancel="aOpen = false"
>
The content of Dialog A.
</veui-dialog>
<veui-button @click="bOpen = true">
Dialog B
</veui-button>
<veui-dialog
:open.sync="bOpen"
title="Dialog B"
draggable
:modal="false"
@ok="bOpen = false"
@cancel="bOpen = false"
>
The content of Dialog B.
</veui-dialog>
</article>
</template>
<script>
import { Dialog, Button } from 'veui'
export default {
components: {
'veui-dialog': Dialog,
'veui-button': Button
},
data () {
return {
aOpen: false,
bOpen: false
}
}
}
</script>
<style lang="less" scoped>
.veui-button {
margin-right: 20px;
}
</style>
API
Props
Name | Type | Default | Description | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ui | string= | - | Style variants.
| ||||||||||||||||
modal | boolean= | true | Whether to display a backdrop to block interactions with the content underneath. Modal dialogs preempt focus by default (will return focus when closed). | ||||||||||||||||
title | string= | - | The title of the dialog. Will be ignored if title slot is specified. | ||||||||||||||||
open | boolean= | false |
Whether the dialog is open. | ||||||||||||||||
closable | boolean= | true | Whether to display a close button at the top right corner. | ||||||||||||||||
outside-closable | boolean= | false | Wether to close the dialog when user click outside. | ||||||||||||||||
draggable | boolean= | false | Whether the dialog is draggable. | ||||||||||||||||
escapable | boolean= | false | Whether to allow closing the dialog after pressing esc. Only works when closable is set to true . | ||||||||||||||||
inline | boolean= | false | Whether the dialog is displayed inline thus takes up space. | ||||||||||||||||
footless | boolean= | false | Whether to hide the default footer. | ||||||||||||||||
loading | boolean= | false | Wehter the dialog is in loading state. When loading, the OK button will enter loading state as well and become unclickable. | ||||||||||||||||
disabled | boolean= | false | Wehter the dialog is disabled. When disabled, the OK button will be disabled as well and become unclickable. | ||||||||||||||||
ok-label | string= | - | The text content of the “OK” button. | ||||||||||||||||
cancel-label | string= | - | The text content of the “Cancel” button. | ||||||||||||||||
priority | number= | - | The stacking priority of the dialog overlay. See the priority prop of Overlay component. | ||||||||||||||||
before-close | function(string): boolean=|Promise<boolean=> | - | Executed when user interaction is about to trigger closing the dialog. The type is
| ||||||||||||||||
overlay-class | string | Object= | - | The class expression applied to the root element of the dialog overlay. See the overlay-class prop of Overlay component. | ||||||||||||||||
overlay-style | string | Array | Object= | - | See the overlay-style prop of the Overlay component. |
Slots
Name | Description | ||||||
---|---|---|---|---|---|---|---|
default | The content of the dialog. | ||||||
title | The title of the dialog. Will ignore the title prop if this slot is specified. | ||||||
foot | The foot of the dialog. Displays “OK” and “Cancel” buttons by default.
|
Events
Name | Description |
---|---|
ok | Triggered after the “OK” button is clicked or the dialog is closed with the slot scope function call close('ok') . |
cancel | Triggered after the “Cancel” button or the close button is clicked, or esc is pressed, or the dialog is closed with the slot scope function call close('cancel') . |
<value> | Triggered when the dialog is closed with the slot scope function call close(value) . |
afterclose | Triggered after the dialog is closed. If leave transition is provided by theme, then afterclose will be triggered when the transition finishes. |
Icons
Name | Description |
---|---|
close | Close. |