Chengyu 的博客

最远,不是距离而是昨天

vue3使用v-for生成多个el-radio-group时,数据的绑定问题

问题

在项目中,使用v-for生成多个el-radio-group,并用一个由ref组成的数组benefitRadio,来作为多个radio group的v-model。每个group在绑定时,用item的id属性来指定绑定值的下标。

界面代码如下:

 1       <el-scrollbar height="450px" :always="true">
 2         <div v-for="item in this.benefitTable" :key="item.id">
 3           <div class="ques-text">{{ item.question }}</div>
 4           <el-radio-group
 5             v-model="benefitRadio[item.id]"
 6             @change="handleRadioGroup($event, item.id)"
 7           >
 8             <el-radio :label="0">0</el-radio>
 9             <el-radio :label="1">1</el-radio>
10             <el-radio :label="2">2</el-radio>
11             <el-radio :label="3">3</el-radio>
12             <el-radio :label="4">4</el-radio>
13           </el-radio-group>
14         </div>
15       </el-scrollbar>

绑定值数组benefitRadio初始化代码如下:

1     let benefitRadio = [];
2     for (let i = 0; i < 15; i++) {
3       benefitRadio.push(ref(-1));
4     }

数组的每一项都是一个ref对象,初始化为-1,使得单选组在刚刚出现时,每个选项都处于未选中的状态。

但是,在点击选项之后,选项并不会变成正常的被选中状态,直到上下滚动或者前后页切换一下,选项的状态才会更新

解决过程

起初用网上的方法,在radio group的@change事件函数中,增加this.$forceUpdate();

1     handleRadioGroup($event, id) {
2       console.log("radio-group changed:", $event, id);
3       this.$forceUpdate();
4       //todo
5     },

但情况丝毫没有变化。@change函数在我的项目中是用不到的,理论上应该使用v-model绑定就足够。所以我想到可能是绑定值的问题。浏览器控制台的报错也基本能证明这一点,报错说v-model的值应该是bool,string,int,而不能是个对象。所以,我将绑定值作为单个ref对象,而把整个list放到一个ref里。

最终,初始化绑定值的代码如下:

1     let benefitRadio = [];
2     for (let i = 0; i < 15; i++) {
3       benefitRadio.push(-1);
4     }
5     benefitRadio = ref(benefitRadio);

成功解决问题,选项在点击之后就能变为被选中状态。

 

posted @ 2021-12-12 12:03  chengyufeng  阅读(4598)  评论(0编辑  收藏  举报

翻到了这里,不容易啊