Код, который вы уже должны установить graphicState[index].selected
на true
для радиовходов, но входные значения (и, следовательно, от graphicState[index].selected
до v-model
) никогда не устанавливаются на false
, что является проблемойесли пользователю разрешено передумать выбрать другой вход.Это происходит потому, что change
-event радиовхода запускается только тогда, когда его свойство checked
установлено в истинное значение (при выборе).
Одним из решений является добавление обработчика change
-eventэто очищает значение .selected
для невыбранных входов.
// template
<tr v-for="(form, index) in graphicState">
<input @change="onRadioChange(index)" ...>
</tr>
// script
onRadioChange(selectedIndex) {
this.graphicState
.filter((x,i) => i !== selectedIndex) // get non-selected inputs
.forEach(x => x.selected = false)
}
Но есть еще одна проблема, если вы используете собственную отправку HTMLFormElement
.В следующем шаблоне, когда значение v-model
равно true
, Vue устанавливает свойство checked
радиовхода на true
, что говорит HTMLFormElement
использовать значение этого конкретного входа в качестве группы value
...
<input type="radio"
name="grp"
v-model="form.selected"
value="true">
Все радиовходы имеют одинаковое значение, поэтому получатель данных формы не сможет определить, какой вход выбран.Чтобы решить эту проблему, присвойте уникальное значение каждому входу на основе элемента итератора.Например, вы можете использовать идентификатор:
<input type="radio"
name="grp"
v-model="form.selected"
value="form.id">
new Vue({
el: '#app',
data() {
return {
graphicState: [
{id: 'A', selected: false, show: false},
{id: 'B', selected: false, show: false},
{id: 'C', selected: false, show: false},
]
}
},
methods: {
mouseleave() {},
removeDate() {},
toggleShape() {},
onRadioChange(selectedIndex) {
this.graphicState
.filter((x,i) => i !== selectedIndex)
.forEach(x => x.selected = false)
},
}
})
Show
Select
Shape
{{ form.shape }}
{{graphicState}}