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 @   chengyufeng  阅读(4734)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

翻到了这里,不容易啊

点击右上角即可分享
微信分享提示