Suppose I have a functional component:
<template functional> <div>Some functional component</div> </template> Now I render this component in some parent with classes:
<parent> <some-child class="new-class"></some-child> </parent> Resultant DOM doesn't have new-class applied to the Functional child component. Now as I understand, Vue-loader compiles Functional component against render function context as explained here. That means classes won't be directly applied and merge intelligently.
Question is - how can I make Functional component play nicely with the externally applied class when using a template?
Note: I know it is easily possible to do so via render function:
Vue.component("functional-comp", { functional: true, render(h, context) { return h("div", context.data, "Some functional component"); } });
Use data.staticClass to get the class, and bind the other attributes using data.attrs
<template functional> <div class="my-class" :class="data.staticClass || ''" v-bind="data.attrs"> //... </div> </template> v-bind binds all the other stuff, and you may not need it, but it will bind attributes like id or style. The problem is that you can't use it for class because that's a reserved js object so vue uses staticClass, so binding has to be done manually using :class="data.staticClass".
This will fail if the staticClass property is not defined, by the parent, so you should use :class="data.staticClass || ''"
I can't show this as a fiddle, since only "Functional components defined as a Single-File Component in a *.vue file also receives proper template compilation"
I've got a working codesandbox though: https://codesandbox.io/s/z64lm33vol
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