You are right. I have a component which contains 5 radio buttons.
When I apply several these components on another view, duplicated id happens !
After improvement by v-bind id, duplicated id is fixed and these components perform properly .
The component is:
<template>
<div class="container">
<div class="star-widget">
<input type="radio" v-bind:name="myname" v-bind:id="myrate5" @click="starclick(5)">
<label v-bind:for="myrate5" class="fas fa-star" :style="ratingStyle(5)"></label>
<input type="radio" v-bind:name="myname" v-bind:id="myrate4" @click="starclick(4)">
<label v-bind:for="myrate4" class="fas fa-star" :style="ratingStyle(4)"></label>
<input type="radio" v-bind:name="myname" v-bind:id="myrate3" @click="starclick(3)">
<label v-bind:for="myrate3" class="fas fa-star" :style="ratingStyle(3)"></label>
<input type="radio" v-bind:name="myname" v-bind:id="myrate2" @click="starclick(2)">
<label v-bind:for="myrate2" class="fas fa-star" :style="ratingStyle(2)"></label>
<input type="radio" v-bind:name="myname" v-bind:id="myrate1" @click="starclick(1)">
<label v-bind:for="myrate1" class="fas fa-star" :style="ratingStyle(1)"></label>
</div>
<div class="rating"> {{ myrating }} </div>
</div>
</template>
<script>
export default {
name: 'Ratingstar',
components: {
},
props: [ 'myrating', 'mymovieid', 'myrate5', 'myrate4', 'myrate3', 'myrate2', 'myrate1', 'myname' ],
methods: {
starclick(i) {
//console.log('mymovieid: ' + this.mymovieid)
this.$emit('starclicked', i, this.mymovieid)
},
ratingStyle(j) {
if (this.myrating > j-1) {
return {color: '#fd4'}
}
}
}
}
</script>
In another containing view, the components are duplicated according the size of movies list:
<template>
<div>
<h1 class="mt-4">Dashboard</h1>
</div>
<div class="container">
<div class="col-md-3" v-for="movie in movies" :key="movie.imdbid">
<img v-bind:src="movie.poster" />
<p style="text-align: center;"> {{ movie.title }} </p>
<p style="text-align: center;"> {{ movie.imdbid }} </p>
<star-input
v-model:myrating="movie.rate"
v-model:mymovieid="movie.imdbid"
v-model:myname="movie.starname"
v-model:myrate1="movie.starid[0]"
v-model:myrate2="movie.starid[1]"
v-model:myrate3="movie.starid[2]"
v-model:myrate4="movie.starid[3]"
v-model:myrate5="movie.starid[4]"
@starclicked="starclickHandler" />
</div>
</div>
</template>
The name, id and for are v-bind by parent view's data movies[]