VDialog
This module will help you to work with modal dialogs in your project
Inspire of Nuxt.js logic, VDialog also has asyncData
, fetch
, layout
and middleware
handlers
NOTE: Module is in initial development. Anything may change at any time.
Setup
Install the package from npm
npm install v-dialog
import VDiaog from 'v-dialog'
Vue.use(VDiaog, {
context,
property
})
Where
-- context
: is object with context of your application, such as i18n, store, router, etc
-- property
: is name of Vue property, for access, default is $dialog
After instalation, instance of dialog manager will be available in Vue.prototype.$dialog, or inside Vue instances this.$dialog
Usage
Use dialogs
import MyDialog from './MyDialog'
const dialog = await this.$dialog.show(MyDialog, params, options)
dialog
will be instance of DialogManager
Register anduse global dialog
Register global dialog template, which will be available in any vue module
Vue.prototype.$dialog.register('myDialog', MyDialog)
Then you can use it in any code
this.$dialog.myDialog(params, options)
Waiting for user fiil data and click button (when dialog is closing)
const result = await this.$dialog.showAndWait(MyDialog, params)
or
const dialog = await this.$dialog.show(MyDialog, params)
const result = dialog.wait()
result
will be object of user inputs, or clicked button, depending on what will be sent in dialog component by the:
this.$emit('close', inputs)
this.$emit('result', inputs)
The layout param
VDialog can use layout templates for wrapping dialogs
For registering your own layouts template use
Vue.prototype.$dialog.layout('default', MyLayout)
Example of the layout template
<v-dialog v-model="showed" :max-width="width">
<dialog-child v-bind="$options.propsData" ref="dialog"/>
</v-dialog>
VDialog module will put in layout component mixin with params:
-- width
: Number - max width of component
-- showed
: Boolean - is dialog showed
-- show
: Function
-- close
: Function
If dialog showed without layout, this mixin will integrate to dialog instance
After this dialog component must have parameter
{
layout: 'default'
...
}
The asyncData and fetch Method
Sometimes you just want to fetch data and pre-render it on the server without using a store. asyncData
is called every time before loading the dialog component. This method receives [the context] as the first argument, you can use it to fetch some data and v-dialog will merge it with the component data.
You do NOT have access of the component instance through this
inside asyncData
because it is called before initiating the component
v-dialog offers you different ways to use asyncData
. Choose the one you're the most familiar with:
fetch
is use for calling store methods, and not impact to instance data
- Returning a
Promise
. v-dialog will wait for the promise to be resolved before rendering the component. - Using the async/await proposal (learn more about it)
- Define a callback as second argument. It has to be called like this:
callback(err, data)
Returning a Promise
export default {
asyncData ({ params }) {
return axios.get(`https://my-api/posts/${params.id}`)
.then((res) => {
return { title: res.data.title }
})
}
}
Using async/await
export default {
async asyncData ({ params }) {
let { data } = await axios.get(`https://my-api/posts/${params.id}`)
return { title: data.title }
}
}
Using a callback
export default {
asyncData ({ params }, callback) {
axios.get(`https://my-api/posts/${params.id}`)
.then((res) => {
callback(null, { title: res.data.title })
})
}
}
Displaying the data
The result from asyncData will be merged with data.
You can display the data inside your template like you're used to doing:
<template>
<h1>{{ title }}</h1>
</template>
The overlay
When dialog component has an asyncData
or fetch
functions, it will show overlay before calling this methods. Overlay will block main window and show loading cursor.
If you want to register your own overlays template
Vue.prototype.$dialog.overlay('default', MyOverlay)
Confirm, alert and prompt dialogs
VDialog has implementations of confirm, alert warning, error or prompt dialog
this.$dialog.confirm('Do you really want to exit?').then(res => {
})
const res = await this.$dialog.warning('Do you really want to exit?')
...
const res = await this.$dialog.error('Do you really want to exit?')
let res = await this.$dialog.confirm('Do you really want to exit?', {title: 'Warning'})
if (res) {
...
}
res will be true or false
You can format your message with arbitrary HTML - make sure you don't include any user-provided content here:
this.$dialog.confirm('Please do not do this.<br>Do you really want to exit?'}).then(res => {
})
For registering own Confirm template
Vue.prototype.$dialog.register('Confirm', MyConfirmDialog)
For registering own Prompt template
Vue.prototype.$dialog.register('Prompt', MyPromptDialog)