求助:Vuetify v-data-table中v-radio点击后全部选中问题
解决Vuetify v-data-table中v-radio单选全选的问题
嘿,我一眼就看出问题所在了——你现在给每一行都单独套了一个v-radio-group,而且所有组都绑定到同一个ex8变量上,这就导致所有单选框共享同一个选中状态,点任何一个都会触发全选。要实现真正的单行单选,我们需要调整单选组的结构,让整个表格的单选框属于同一个组。
下面是修改后的完整代码,我会标注关键改动:
修改后的HTML代码
<v-data-table :headers="headersAllClientesCadastrados" :items="AllClientesCadastrados" :search="searchAllClientesCadastrados" > <template v-slot:item="row"> <tr> <td> <!-- 移除每行的独立radio group,改用全局组管理 --> <v-radio color="primary" :value="row.item.codigo" <!-- 用客户的唯一标识作为单选值,比如codigo --> v-model="selectedCliente" <!-- 绑定到全局的选中变量 --> @change="selecionaCliente(row.item)" <!-- 用change事件替代click,状态更新更准确 --> ></v-radio> </td> <td>{{ row.item.codigo }}</td> <td>{{ row.item.empresa }}</td> <td>{{ row.item.responsavel }}</td> <td>{{ row.item.email }}</td> </tr> </template> </v-data-table> <!-- 全局单选组,隐藏它只用来管理状态 --> <v-radio-group v-model="selectedCliente" hidden></v-radio-group>
修改后的Script代码
export default { name: "NewDI", data: function () { return { selectedCliente: null, // 存储选中客户的唯一标识(比如codigo) headersAllClientesCadastrados: [ { text: '', value: '' }, // 修正headers的value属性,确保和item字段匹配 { text: "Código", value: "codigo" }, { text: "Empresa", value: "empresa" }, { text: "Responsável", value: "responsavel" }, { text: "Email", value: "email" }, ], searchAllClientesCadastrados: '', AllClientesCadastrados: [], } }, methods: { selecionaCliente(row){ console.log('selected', row); }, } }
关键改动说明
- 统一单选组范围:把原来每行的
v-radio-group移到表格外,作为全局组,所有行的v-radio都属于这个组,自然只能选中一个。 - 绑定全局选中变量:用
selectedCliente代替原来的ex8,专门存储选中客户的唯一标识,方便后续获取选中数据。 - 修正表头匹配:原来的
headers里的value和你的item字段不对应(比如写了numCotation但实际是codigo),我已经修正了,这样表格数据能正确渲染。 - 事件优化:把
@click换成@change,因为click可能在单选框状态未更新时触发,change会在状态确认改变后执行,逻辑更可靠。
现在你再测试一下,点击任意行的单选框,只会选中当前行,其他行的单选框会自动取消选中,同时selecionaCliente也能正确拿到选中的客户对象啦。
内容的提问来源于stack exchange,提问作者Matheus Barem
相关产品推荐
相关产品推荐

