我有一长串复选框。我想两组中的三组作为单选按钮。现在,不考虑我的用户体验选择,我该如何做到这一点?
复选框实现为单个对象layer
上的属性:
data: {
layer: {},
},
watch: {
layer: {
handler: function(val, oldval) {
mapping.updateLayers(val);
},
deep: true
}
}
工作正常。但是拦截val
并更新this.layer
内的handler()
并不是:
handler: function(val, oldval) {
if (val.FutureYear) { this.layer.NextYear = false; this.layer.ExistingYear = false; }
if (val.ExistingYear) { this.layer.NextYear = false; this.layer.FutureYear = false; }
if (val.NextYear) { this.layer.ExistingYear = false; this.layer.FutureYear = false; }
mapping.updateFoiLayers(val);
},
我怎样才能达到这个效果? (我不想实现实际的单选按钮,因为这会使管理所有图层和UI变得更复杂。)
答案 0 :(得分:5)
示例:https://codepen.io/jacobgoh101/pen/NyRJLW?editors=0010
主要问题是watch
中的逻辑。
如果已选择FutureYear,则其他字段将变为不可更改。因为if (val.FutureYear)
始终是第一个被触发的,而另外两个字段将始终设置为假。
关于watch
的另一件事是它会在
因此,在这种情况下处理@change
事件更合适。
JS
methods: {
handleChange: function(e) {
const name = e.target.name;
if (this.layer[name]) {
Object.keys(this.layer).map((key)=>{
if(key != name) {
this.layer[key] = false;
}
})
}
}
}
HTML
<div id="app">
<input type="checkbox"/ v-model="layer.FutureYear" name="FutureYear" @change="handleChange($event)">FutureYear<br/>
<input type="checkbox"/ v-model="layer.NextYear" name="NextYear" @change="handleChange($event)">NextYear<br/>
<input type="checkbox"/ v-model="layer.ExistingYear" name="ExistingYear" @change="handleChange($event)">ExistingYear<br/>
</div>