问题:在全选中的情况下,点击任意一个单选,会导致全部取消选择
![](https://i-blog.csdnimg.cn/direct/072992b56cac4d01a4a3f8f2857baebd.png)
![](https://i-blog.csdnimg.cn/direct/8e2575744e1547de85745f34d6872ab2.png)
代码
// 单选按钮点击
const checkChange = (val) => {
console.log('checkChange', val)
const checkedCount = val.length
isCheckAll.value = (checkedCount === state.content.length)
}
// 全选按钮点击
const checkAll = (val) => {
console.log('checkAll', val)
state.checkedList = (val ? state.content.map(item => item.id) : [])
isCheckAll.value = false
}
解决方式:是因为单选按钮改变了全选字段isCheckAll的状态,导致同时触发了全选方法。
新增两个字段进行控制,更改后的代码:
// 目前vant 中checkbox组件有bug。按照文档写会导致全选情况下点击单选造成全部取消
// 所以通过这两个字段进行优化
const isTriggeredByCheckAll = ref(false);
const isTriggeredByCheck = ref(false);
// 单选按钮点击
const checkChange = (val) => {
console.log('checkChange', val)
isTriggeredByCheck.value = true
if (!isTriggeredByCheckAll.value){
isCheckAll.value = (val.length === state.content.length)
}
setTimeout(()=>{
isTriggeredByCheck.value = false
},0)
}
// 全选按钮点击
const checkAll = (val) => {
if (!isTriggeredByCheck.value){
isTriggeredByCheckAll.value = true
state.checkedList = (val ? state.content.map(item => item.id) : []);
setTimeout(()=>{
isTriggeredByCheckAll.value = false
},0)
}
}
通过异步的方式,方式触发另一个事件。这样就解决了相关问题