Skip to content

Instantly share code, notes, and snippets.

@Matodor
Last active January 25, 2021 11:01
Show Gist options
  • Save Matodor/464d71fd1b403ff4ca90bb31b3ad6d42 to your computer and use it in GitHub Desktop.
Save Matodor/464d71fd1b403ff4ca90bb31b3ad6d42 to your computer and use it in GitHub Desktop.
Vuetify dynamic creation Snackbar component
import Vue from 'vue';
import { VSnackbar } from 'vuetify/lib';
import _ from 'underscore';
const plugin = {
install: () => {
Vue.prototype.$showSnackbar = function (content = '', props = {}) {
const appEl = document.getElementById('monitoring');
const snackbarEl = document.createElement('div');
appEl.appendChild(snackbarEl);
const snackbarComponent = VSnackbar.extend({
watch: {
isActive(val, oldValue) {
if (this.transition === false && !val) {
this.destroy();
}
},
},
methods: {
destroy() {
this.$destroy();
this.$el.remove();
},
genTransition() {
let that = this;
return this.$createElement('transition', {
props: {
name: this.transition
},
on: {
'after-leave': function () {
that.destroy();
},
},
}, [this.genWrapper()]);
},
},
});
const snackbar = new snackbarComponent({
parent: this,
propsData: {
value: true,
...props,
},
});
// noinspection JSConstantReassignment
snackbar.$scopedSlots = {
action: function (props) {
return snackbar.$createElement('v-btn', {
class: props.attrs.class,
props: {
icon: true,
},
on: {
click: () => {
snackbar.isActive = false;
},
},
}, [snackbar.$createElement('v-icon', ['mdi-close'])]);
},
default: function () {
if (_.isFunction(content)) {
return content(snackbar.$createElement);
} else if (_.isString(content)) {
return snackbar.$createElement('span', { }, [content]);
} else {
return snackbar.$createElement('span', { }, ['Placeholder']);
}
},
};
snackbar.$mount(snackbarEl);
};
},
}
export default plugin;
@Matodor
Copy link
Author

Matodor commented Jan 24, 2021

Example usage:

Vue.use(plugin);
vm.$showSnackbar('TEST', { color: 'success' });
vm.$showSnackbar((createElement) => createElement('div', ['TEST']);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment