Vue2 + ElementUI 批量更新排序/产品分类完整实现

📅 2026/6/23 19:42:45
Vue2 + ElementUI 批量更新排序/产品分类完整实现
Vue2 ElementUI 批量更新排序/产品分类完整实现分两种场景批量拖拽排序、批量勾选修改分类适配你产品列表分页场景编辑返回保留页码逻辑不变。一、批量拖拽排序el-table 行拖拽1. 安装拖拽依赖 sortablejsnpmi sortablejs--save2. 表格组件代码template div el-table reftable :datatableData border row-keyid el-table-column label排序 width80 template slot-scope{ row } i classel-icon-sort stylecursor:move;color:#999/i /template /el-table-column el-table-column propname label产品名称/el-table-column el-table-column propsort label当前排序值/el-table-column /el-table el-button typeprimary clickbatchSaveSort批量保存排序/el-button /div /template script import Sortable from sortablejs export default { data() { return { tableData: [], // 拖拽后新排序数组 sortList: [] } }, mounted() { this.initDrag() }, methods: { // 初始化拖拽 initDrag() { const el this.$refs.table.$el.querySelector(.el-table__body-wrapper tbody) Sortable.create(el, { animation: 150, ghostClass: sort-ghost, onEnd: ({ newIndex, oldIndex }) { // 拖拽完成记录新顺序 this.sortList this.tableData.map((item, idx) ({ id: item.id, sort: idx 1 // 排序值从1自增 })) } }) }, // 批量提交排序接口 async batchSaveSort() { if (!this.sortList.length) { this.$message.warning(未调整排序) return } const res await this.$api.product.batchSort(this.sortList) if (res.code 0) { this.$message.success(排序更新成功) // 刷新当前页列表保留分页 this.getList() this.sortList [] } }, // 请求列表原有分页逻辑不变 getList() { // ...你的分页请求代码 } } } /script style scoped ::v-deep .sort-ghost { background: #ecf5ff !important; } /style后端接口传参格式// sortList 传给后端[{id:101,sort:1},{id:105,sort:2},{id:103,sort:3}]二、批量勾选修改产品分类最常用批量操作1. 表格批量操作按钮template div !-- 批量操作区 -- el-button typewarning clickopenBatchCateDialog批量修改分类/el-button el-table reftable :datatableData border row-keyid selection-changehandleSelectionChange !-- 多选框 -- el-table-column typeselection width55/el-table-column el-table-column propname label产品名称/el-table-column el-table-column propcateName label所属分类/el-table-column /el-table !-- 批量修改分类弹窗 -- el-dialog title批量修改分类 :visible.syncbatchDialogVisible width400px el-select v-modelbatchCateId placeholder请选择分类 el-option v-foritem in cateList :keyitem.id :labelitem.name :valueitem.id /el-option /el-select div slotfooter classdialog-footer el-button clickbatchDialogVisible false取消/el-button el-button typeprimary clickconfirmBatchCate确定修改/el-button /div /el-dialog /div /template script export default { data() { return { tableData: [], multipleSelection: [], // 选中行数组 batchDialogVisible: false, batchCateId: , // 批量选中分类ID cateList: [] // 全部分类下拉数据 } }, methods: { // 勾选事件 handleSelectionChange(val) { this.multipleSelection val }, // 打开批量弹窗 openBatchCateDialog() { if (!this.multipleSelection.length) { this.$message.warning(请先勾选要修改的产品) return } this.batchCateId this.batchDialogVisible true }, // 确认批量修改分类 async confirmBatchCate() { if (!this.batchCateId) { this.$message.warning(请选择分类) return } // 提取勾选产品id数组 const ids this.multipleSelection.map(item item.id) const params { ids, cateId: this.batchCateId } const res await this.$api.product.batchUpdateCate(params) if (res.code 0) { this.$message.success(批量修改成功) this.batchDialogVisible false this.multipleSelection [] // 清空勾选 this.$refs.table.clearSelection() // 清空表格勾选框 // 刷新当前分页列表保留第二页不跳回第一页 this.getList() } }, getList() { // 原有分页请求逻辑 } } } /script后端批量接口参数{ids:[101,102,103],// 批量产品ID数组cateId:5// 目标分类ID}三、结合你之前「编辑返回丢失页码」问题配套处理1. keep-alive 缓存列表 批量操作刷新不丢页// 列表页 activated 钩子从编辑/批量弹窗回来自动刷新activated(){// 批量修改、编辑完成后都会重新请求当前页数据this.getList()}2. 如果不用 keep-alive分页参数统一存 query批量操作成功后不用router.back()直接刷新当前路由// 批量成功后刷新列表保留页码this.$router.push({path:/product/list,query:{page:this.pageNum,size:this.pageSize}})四、常用拓展功能批量删除和批量改分类逻辑一致拿到ids数组调用删除接口成功刷新列表。批量上下架增加下拉选择状态传ids status批量更新。拖拽排序分页兼容问题拖拽仅作用当前页数据跨页排序不推荐前端处理如需全局统一排序后端提供全局拖拽接口分页只展示当前区间。五、踩坑点sortablejs 绑定tbody不要绑定table否则拖拽失效批量操作后必须clearSelection()否则勾选状态残留分页第二页批量更新后调用getList()即可保持当前页码不会重置pageNum1query 参数是字符串请求接口时记得转数字Number(this.$route.query.page)。