I have a form that changes some text within a vue component when a select box is changed. I've created a highly minimized version of this in jsfiddle to show the issue I'm experiencing:
https://jsfiddle.net/ywaug7ft/
HTML:
<div id="app">
<h5>Select a gender</h5>
<select v-model="gender">
<option disabled="disabled" value>Select...</option>
<option value="1">Male</option>
<option value="2">Female</option>
<option value="3">Couple</option>
</select>
<div></div>
<detail-component v-for="(detail, index) in details" :data="detail" :index="index"></detail-component>
{{details}}
</div>
<template id="details">
<div>
<h4><span v-if="item.gender == 3 && index == 0">Her</span><span
v-else-if="item.gender == 3 && index == 1">His</span><span v-else>Your</span> Health Details</h4>
<div>Index: {{index}}</div>
<div>Gender: {{item.gender}}</div>
</div>
</template>
Vue:
Vue.component('detail-component', {
template: '#details',
props: ['data', 'index'],
data() {
return {
item: {
gender: this.data.gender
}
}
}
});
var app = new Vue({
el: '#app',
data: {
gender: '',
details: [],
options: {
gender: {
"1": "Single Female",
"2": "Single Male",
"3": "Couple"
}
}
},
watch: {
gender: function(val) {
this.details = [];
if (val == 1) {
this.details.push({gender: 1});
} else if (val == 2) {
this.details.push({gender: 2});
} else if (val == 3) {
this.details.push({gender: 3}, {gender: 3});
}
}
}
});
Basically, when I select female
or male
from the dropdown, my vue component should update the h tag to say Your Details
. When I select couple
, my view component should update to say Her Details
and His Details
. However, it's not updating the first index to Her
but instead maintains Your
.
Take a look at the jsfiddle and you'll see what I mean exactly.
Just trying to understand what I'm doing wrong. I thought that using watcher would be reactive in the component.
You are not watching inside the child if a prop value is getting updated.
So here whenever the prop data
changes you need to watch
it as well in the child component.
Watch Fiddle,
watch:{
data(val){
this.item.gender=val.gender
}
}
Or computed property Fiddle.
computed:{
item(){
return this.data;
}
}
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