uni-app多选删除必须用data()中声明的响应式selectedids数组驱动,checkbox需包裹在checkbox-group内并用:checked绑定,防重复提交、分页清空、列表重用状态同步缺一不可。

多选删除功能在 uni-app 里不是靠 DOM 操作“记一下勾选”,而是必须用响应式数据驱动,否则滚动、刷新、分页后状态全丢——这是 90% 的人第一次写就翻车的地方。
selectedIds 必须声明在 data() 里
不能写成 let selectedIds = [] 放 methods 外,也不能塞进临时对象或 computed。必须在 data() 中显式声明:
-
selectedIds: [](推荐用 ID 字符串数组,避免 number/string 类型混用) - 勾选时用
this.selectedIds.push(item.id + ''),别直接赋值覆盖数组 - 取消勾选别用
splice找索引删,改用this.selectedIds = this.selectedIds.filter(id => id !== item.id + ''),更安全且触发响应更新 - 如果用了
Object.assign或扩展运算符重置数组,要确保是新引用,否则 Vue 2 不会监听变化
checkbox-group 是唯一合法容器
单个 checkbox 必须包裹在 checkbox-group 内,否则:bindchange 不触发、iOS 样式错乱、form 提交收不到值。
-
checkbox的value只能是字符串或数字,推荐统一转成item.id + '' -
checked属性靠判断::checked="selectedIds.includes(item.id + '')",不是双向绑定 - 别写
v-model或checked="{{...}}",uni-app 不支持 checkbox 的 v-model -
checkbox-group的bindchange事件接收的是字符串数组,比如["1", "3"],不是布尔值
批量删除前必须防重复提交
用户连点“删除”按钮,uni.showModal 还没关,请求已发好几遍——后端可能只删一条,前端列表状态彻底混乱。
- 发起请求前设开关:
this.isDeleting = true,成功/失败回调里都设回false - 按钮加
:disabled="isDeleting",文字动态显示为“删除中…” - 接口返回后,别等下拉刷新才更新 UI:要么重新
uni.request拉列表,要么本地this.tableList = this.tableList.filter(item => !this.selectedIds.includes(item.id + '')) - 后端支持批量删就传
{ ids: this.selectedIds };不支持就用Promise.all(this.selectedIds.map(id => uni.request({...}))),但得加uni.showToast({ title: '正在删除 ${this.selectedIds.length} 条' })
分页列表清空 selectedIds 要加确认
用户在第 1 页勾选了 3 条,翻到第 2 页点“全选”,再点“删除”——如果不主动清空 selectedIds,下次翻回第 1 页时那 3 条还在数组里,一不小心就误删。
- “全选”逻辑不是简单 push 所有 ID,而是先清空再 push 当前页的:
this.selectedIds = currentItems.map(i => i.id + '') - “全选删除”按钮点击前,弹
uni.showModal提示“将删除当前页及已勾选项”,并明确写“共 X 条” - 切换页码时,除非用户明确点了“保留勾选”,否则自动清空
selectedIds—— 这个行为必须和产品对齐,不能默认保留
最易被忽略的是:列表项重用(如 scroll-view 或长列表虚拟滚动)时,checkbox 的 checked 状态必须完全由 selectedIds 数组驱动,不能依赖 item 对象上的 checked: true 字段——后者在组件复用时极易残留旧状态,导致勾选错位。










