// adapted from // https://stackoverflow.com/questions/41791193/vuejs-reactive-binding-for-a-plugin-how-to/41801107#41801107 import Vue from 'vue'; class ModalStore { constructor(data = {}) { this.vm = new Vue({ data: () => ({ component: '', payload: {} }) }); } get state() { return this.vm.$data; } } const ModalPlugin = { install(Vue, options) { const store = new ModalStore({}); const reset = () => { store.state.component = ''; store.state.payload = {}; }; Vue.prototype.$modal = { state: store.state, component: store.state.component, payload: store.state.payload, open: (component, payload) => { store.state.payload = payload; store.state.component = component; return new Promise((resolve, reject) => { this._resolve = resolve; this._reject = reject; }); }, confirm: (res) => { reset(); this._resolve(res); }, cancel: () => { reset(); this._reject(); }, _resolve: () => { }, _reject: () => { }, }; } }; export default ModalPlugin;