UNPKG

jenesius-vue-modal

Version:

The progressive and simple modal system for Vue.js v3

252 lines (195 loc) 7.08 kB
<p align="center"><a href="https://modal.jenesius.com/" target="_blank" rel="noopener noreferrer"><img height="100" src="https://modal.jenesius.com/images/logo.svg" alt="Vue logo"></a></p> <p align="center"> <a href="https://img.shields.io/github/issues/Jenesius/vue-modal"><img src="https://img.shields.io/github/issues/Jenesius/vue-modal" alt="Downloads"></a> <a href="https://img.shields.io/npm/dw/jenesius-vue-modal"><img src="https://img.shields.io/npm/dw/jenesius-vue-modal" alt="Downloads"></a> <a href="https://img.shields.io/github/stars/Jenesius/vue-modal"><img src="https://img.shields.io/github/stars/Jenesius/vue-modal" ></a> <a href="https://github.com/Jenesius/vue-modal/actions/workflows/node.js.yml/badge.svg"><img src="https://github.com/Jenesius/vue-modal/actions/workflows/node.js.yml/badge.svg" alt="Issue"></a> <a href="https://img.shields.io/npm/l/jenesius-vue-modal"><img src="https://img.shields.io/npm/l/jenesius-vue-modal" alt="Stars"></a> </p> # Jenesius Vue Modal Jenesius vue modal is a progressive and simple modal system for **Vue 3** only . Using this library, you can simply show both one and several modal windows at the same time, integrate with vue-router - [Full Documentation](https://modal.jenesius.com) - [Examples](https://modal.jenesius.com/examples/list.html) ### Installation ```shell npm i jenesius-vue-modal ``` ![Alt Text](./demo-gif.gif) ---- The main condition for library initialization is adding a **container** inside your App.vue file. Note that this container only needs to be **mounted once** in the main parent component. Opened **modals** will be shown inside this container. `App.vue` ```vue <template> <widget-container-modal /> </template> <script> import {container} from "jenesius-vue-modal"; export default { components: {WidgetContainerModal: container}, name: "App" } </script> ``` ## Modal show Methods `openModal` and `pushModal` used to display modal windows. - `openModal` - close all previous modals and then display provided component. - `pushModal` - display provided component ```js import {openModal} from "jenesius-vue-modal"; import SomeVueComponent from "SomeVueComponent.vue"; openModal(SomeVueComponent, props); ``` - props will provide in your component, [example](#example-vuemodalcomponent) Methods return promise, in this case promise is resolved **modalObject**. [More information](https://modal.jenesius.com/guide/modal-object.html) ```js const modal = await openModal(SomeVueComponent); // modal {id, close, onclose, closed, instance, on} ``` ## Methods - `openModal` - close all modals and then open provided modal. - `pushModal` - add one more provided modal. - `closeModal`- close all modals. - `popModal` - close last opened modal. - `promptModal` - opening a modal window and waiting for a value to be returned. [More information](https://modal.jenesius.com/guide/guide-methods.html#prompt-modal) For detailed information about existing methods, follow the [link](https://modal.jenesius.com/guide/guide-methods.html) ```js import {openModal, pushModal, closeModal, popModal} from "jenesius-vue-modal" ``` ## How to return value? Sometimes a modal needs to return a value. This case is described in detail in the [following article](https://modal.jenesius.com/guide/guide-returned-value.html). ## Handle events Using modalObject you can handle any events: ```vue // Modal.vue <template> <button @click = "emit('update', value)"></button> </template> ``` When we click on the button we can handle event using `modal.on(eventName, callback)` ```js const modal = await openModal(Modal, {value: 123}); modal.on('update', v => { console.log(v); // 123 }) ``` ## Lifecycle Hooks **All** hooks use only returned value(Boolean) for navigation hooks. If function return **false** or throwing an Error modal window will not be closed. There are three ways to track the closing of a modal: - onclose ```js const modal = await openModal(Modal, {title: "welcome"}); modal.onclose = () => { console.log("Close"); return false; //Modal will not be closed } ``` or if using function declaration you have access to modal **Instance** by *this*. This declaration provide way to view data within the modal in the parent's onclose() method: ```js //Modal.vue { props: {title: String}, data : () => ({info: "Version x.x.x"}), methods: { update(){} } } //... modal.onclose = function(){ // Has access to the context of the component instance this. this.title; // "welcome" this.info; // "Version x.x.x" this.update(); } ``` - default component ```js export default { props: {}, data: () => ({isValidate: false}), beforeModalClose(){ if (!isValidate) return false; //modal will not be closed while isValidate === false } } ``` - Composition style ```js import {onBeforeModalClose} from "jenesius-vue-modal" export default{ setup() { onBeforeModalClose(() => { console.log("Close"); }); } } ``` ### Async/Await Hooks also can be asynchronous functions: ```js async beforeModalClose(){ await doSome(); return false; // This modal can not be closed! } ``` or ```js beforeModalClose(){ return Promise(resolve => { setTimeout(() => resolve(true), 2000); //Modal will closed after 2 second }) } ``` # Integration with VueRouter For integrate modals into VueRouter you need to initialize your application: - Provide router to the **useModalRouter**: ```js import {createWebHistory, createRouter} from "vue-router"; import {useModalRouter} from "jenesius-vue-modal"; const router = createRouter({ history: createWebHistory(), routes: [...], }); useModalRouter.init(router); //Saving router ``` - Wrap your component in a route handler: ```js import Modal from "Modal.vue" const routes = [ { path: "/any-route", component: useModalRouter(Modal) // Wrap of your VueComponent } ] ``` Now, when route will be */any-route* the Modal window will open. For more information see [Docs](https://modal.jenesius.com/guide/integration-introduction.html). # Style and Animation Please refer to the [documentation](https://modal.jenesius.com/guide/details-styles.html) to change the styles or animations of modals. # Example VueModalComponent `WidgeTestModal.vue` ```vue <template> <p>{{title}}</p> </template> <script> export default { props: { title: String } } </script> ``` To show this component ```js import {openModal} from "jenesius-vue-modal" import WidgeTestModal from "WidgeTestModal.vue"; openModal(WidgeTestModal, { title: "Hello World!" }); ``` --- #### Do you like this module? Put a star on [GitHub](https://github.com/Jenesius/vue-modal)