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);
成功解决问题,选项在点击之后就能变为被选中状态。
Have you LBCCed today?