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?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现