I'm writing a custom directive in vue.
I want it to work like v-if
but it will have a little logic going inside it. Let me explain with an example:
<button v-permission="PermissionFoo">Do Foo</button>
It will check the permission and will show or hide the component.
Currently I'm doing this via CSS styles:
var processPermissionDirective = function (el, binding, vnode) {
if (SOME_LOGIC_HERE) {
el.style.display = el._display;
}
else {
el.style.display = 'none';
}
}
export default {
bind: function (el, binding, vnode) {
el._display = el.style.display;
processPermissionDirective(el, binding, vnode);
},
update: function (el, binding, vnode) {
processPermissionDirective(el, binding, vnode);
}
}
But I don't want this element to stay in the document. So I'm looking for another way other than CSS because it must be also removed from DOM like v-if
does.
Try to use this hack:
Vue.directive('permission', (el, binding, vnode) => {
if (!isUserGranted(binding.value)) {
// replace HTMLElement with comment node
const comment = document.createComment(' ');
Object.defineProperty(comment, 'setAttribute', {
value: () => undefined,
});
vnode.elm = comment;
vnode.text = ' ';
vnode.isComment = true;
vnode.context = undefined;
vnode.tag = undefined;
vnode.data.directives = undefined;
if (vnode.componentInstance) {
vnode.componentInstance.$el = comment;
}
if (el.parentNode) {
el.parentNode.replaceChild(comment, el);
}
}
});
UPD 05-19-2017: My latest code. I define setAttribute()
and check for vnode.componentInstance
to prevent js errors when using with both html elements and Vue components.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With