多选状态必须声明在data中,如selectedIds: [],通过this.selectedIds.push(id)或filter更新,checkbox需用checkbox-group包裹并用:selectedIds.includes(item.id + '')动态绑定checked。

uni-app 列表多选状态怎么存才不丢
多选状态必须存在 data 里,不能靠 DOM 操作或临时变量“记一下”。否则页面滚动、组件更新、下拉刷新后勾选全丢——这是最常踩的坑。
常见错误是把选中项塞进 Array.push() 但没触发响应式更新,或者用 let selected = [] 定义在 methods 外但没挂到 data 上。
- 务必在
data()中声明selectedIds: []或selectedItems: [] - 勾选时用
this.selectedIds.push(id)或this.$set(this, 'selectedIds', [...this.selectedIds, id])(避免直接赋值导致响应失效) - 取消勾选建议用
this.selectedIds = this.selectedIds.filter(x => x !== id),比splice更安全 - 如果列表是分页加载,记得清空
selectedIds时加个确认,否则用户翻页后误删上一页数据
uni-app 的 checkbox 怎么绑定多个 item
checkbox-group 是唯一合法容器,单个 checkbox 必须包在里面,否则 bindchange 不触发,且 iOS 下样式异常。
别用 switch 或自定义 icon 模拟勾选——它们无法和 checkbox-group 联动,也不能被 form-type="submit" 收集。
- 每个
checkbox的value必须是字符串或数字(推荐用item.id + ''),不能是对象 -
checkbox-group bindchange="onCheckboxChange"接收的是字符串数组,比如["1", "3"],不是布尔值 - 不要在
checkbox上写checked="{{item.checked}}"—— uni-app 不支持双向绑定 checkbox 状态,得靠selectedIds数组去动态判断checked属性 - 示例判断逻辑:
:checked="selectedIds.includes(item.id + '')"
uni-app 批量删除接口怎么防重复提交
用户手快连点“删除”按钮,uni.showModal 还没关,请求已发三遍——后端可能只删掉一个,也可能报错,更糟的是前端 UI 状态彻底错乱。
不能只靠弹窗遮罩,得从请求层做控制。
- 发起请求前设个开关:
this.isDeleting = true,请求结束(无论成功失败)再设回false - 按钮加
:disabled="isDeleting",禁用期间显示“删除中…”文字 - 接口返回后,要重新拉取列表 or 用
filter本地移除已删项,别等下一次刷新才更新 UI - 如果后端支持批量 ID 删除,就传
{ ids: selectedIds };不支持的话,别用循环调多次接口,改用Promise.all(…)并发,但得加uni.showToast提示“正在删除 X 条”,别让用户干等
uni-app 在 H5 和小程序里 checkbox 样式不一致怎么办
H5 下 checkbox 默认带浏览器原生样式,小程序里是灰色圆圈,App 端又可能是方框——光靠 CSS 重置搞不定,得用条件编译+自定义图标。
强行统一样式容易破坏可访问性(比如 screen reader 读不出状态),所以优先保功能,再修外观。
- 用
/* #ifdef MP-WEIXIN */等条件编译块,给不同平台写不同 class - 真要自定义图标,用
image+view模拟,但必须手动维护aria-checked和tabindex,否则键盘用户无法操作 - 更稳妥的做法:H5 保留原生 checkbox(语义清晰、兼容好),小程序/App 用
uni-icons或字体图标模拟,只要click事件能正确切换selectedIds就行 - 别忘了测试「全选/反选」按钮在各端是否同步更新所有 checkbox 的视觉状态
多选逻辑看着简单,实际卡点都在状态同步时机和跨端行为差异上。最容易被忽略的是:用户从 A 页面勾选,跳转 B 页面再返回,onShow 里没重置 selectedIds,结果上次的勾选还挂着——这种残留状态比 bug 更难排查。

















