Ok, I’ve got some Vue code and HTML.
For example:
Vue.component('area-selectors-box', { template: ` <div class="area-selectors-box"> <area-selector v-for="(select, index) in selects" :select="select" :key="index"></area-selector> </div> `, props:['selects'] });
And in my page:
<div is="area-selectors-box" v-bind:selects="selects"></div>
It all works, but if I read the page source, I see the v-bind:selects="selects"
portion, which is not standard compliant, I guess.
Similarly, other components have other object properties like:
Vue.component('area-option', { template: `<option :area="area" :value="area.term_id">{{area.name}}<slot></slot></option>` ,props: ['area'] });
which on the page source evaluates to something like:
<option area="[object Object]" value="82">Europa</option>
which is obviously not desirable.
How do I bind these properties without them appearing in the DOM as attributes?
Advertisement
Answer
My own answer is: pass props when you call the component, not in the component itself. This code will work and produce clean html:
In-page HTML:
<!-- pass selects to area-selectors-box --> <div is="area-selectors-box" :selects="selects"></div>
JS:
Vue.component('area-selectors-box', { // pass select to area-selector template: ` <div class="area-selectors-box"> <area-selector v-for="(select, index) in selects" :select="select" :key="index"></area-selector> </div> `, props:['selects'] }); Vue.component('area-selector', { // pass area to area-option template: ` <select @change="selected" > <option disabled selected value="">Seleziona continente</option> <area-option v-for="area in select.areas" :area="area" :key="area.term_id"></area-option> </select> ` ,props:['select'] }); Vue.component('area-option', { // pass nothing template: `<option :value="area.term_id">{{area.name}}<slot></slot></option>` ,props: ['area'] });