当前位置: 首页 > news >正文

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

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

分两种场景:批量拖拽排序批量勾选修改分类,适配你产品列表分页场景,编辑返回保留页码逻辑不变。

一、批量拖拽排序(el-table 行拖拽)

1. 安装拖拽依赖 sortablejs

npmi sortablejs--save

2. 表格组件代码

<template> <div> <el-table ref="table" :data="tableData" border row-key="id" > <el-table-column label="排序" width="80"> <template slot-scope="{ row }"> <i class="el-icon-sort" style="cursor:move;color:#999"></i> </template> </el-table-column> <el-table-column prop="name" label="产品名称"></el-table-column> <el-table-column prop="sort" label="当前排序值"></el-table-column> </el-table> <el-button type="primary" @click="batchSaveSort">批量保存排序</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 type="warning" @click="openBatchCateDialog">批量修改分类</el-button> <el-table ref="table" :data="tableData" border row-key="id" @selection-change="handleSelectionChange" > <!-- 多选框 --> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="name" label="产品名称"></el-table-column> <el-table-column prop="cateName" label="所属分类"></el-table-column> </el-table> <!-- 批量修改分类弹窗 --> <el-dialog title="批量修改分类" :visible.sync="batchDialogVisible" width="400px"> <el-select v-model="batchCateId" placeholder="请选择分类"> <el-option v-for="item in cateList" :key="item.id" :label="item.name" :value="item.id" ></el-option> </el-select> <div slot="footer" class="dialog-footer"> <el-button @click="batchDialogVisible = false">取消</el-button> <el-button type="primary" @click="confirmBatchCate">确定修改</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}})

四、常用拓展功能

  1. 批量删除
    和批量改分类逻辑一致,拿到ids数组调用删除接口,成功刷新列表。
  2. 批量上下架
    增加下拉选择状态,传ids + status批量更新。
  3. 拖拽排序分页兼容问题
  • 拖拽仅作用当前页数据,跨页排序不推荐前端处理;
  • 如需全局统一排序,后端提供全局拖拽接口,分页只展示当前区间。

五、踩坑点

  1. sortablejs 绑定tbody,不要绑定table,否则拖拽失效;
  2. 批量操作后必须clearSelection(),否则勾选状态残留;
  3. 分页第二页批量更新后,调用getList()即可保持当前页码,不会重置pageNum=1;
  4. query 参数是字符串,请求接口时记得转数字Number(this.$route.query.page)
http://www.jsqmd.com/news/1068951/

相关文章:

  • windows系统安装Python + Pycharm教程【新手简洁版】
  • 从开发到售后:Q-Tester基于ODX标准的统一诊断平台
  • 高股息投资笔记-人性的弱点
  • 高质量C++/ C编程指南-文件结构
  • 三款巨好用的workbuddy连接器,一句话查客户情况、生成话术知识库,比skill还好用
  • 【AI原生思维链工程化白皮书】:2026奇点大会首发CoT落地框架、5大工业级验证范式与3类失效熔断机制
  • 连接第二台手机提示:cannot connect to 192.168.1.130:5555: 由于目标计算机积极拒绝,无法连接。 (10061)
  • 香港金库、Vault ID 与链上 NFT:Relique 如何建立资产信任?
  • librime-lua:用Lua脚本为RIME输入法注入无限可能
  • 风丘助力混合动力汽车工况测试:精准采集整车信号解决方案
  • 如何快速部署Carnice-V2-27B:构建高效AI智能体的完整指南
  • 我用手工写标书和AI辅助各做了一周,整理出这份真实对比
  • 终极指南:98个公共Tracker服务器如何让你的BT下载速度翻倍?[特殊字符]
  • 别踩 2026年自定义词库转写的坑:我实操总结的新手实用经验
  • 共享内存操作梳理
  • 5个技巧教你用Gitea Actions实现自动化部署流水线,告别手动部署烦恼
  • 【仅限首批注册开发者】:奇点大会Plugin Architecture工作坊未公开的12个生产级陷阱与对应eBPF监控脚本(有效期至2025.12.31)
  • 进程间通信与匿名管道详解
  • SITS 2026 AI Agent Pipeline设计全链路拆解,深度解析动态意图路由、可信度熔断与跨模态编排协议
  • Java数组深度解析:从基础到架构的实战指南(上)
  • 计算机毕业设计之高校教室场馆资产管理系统
  • 对于Prompt的思考:从“手写”到提示词采样、A/B Test 与自动化评测
  • 2026腾讯地图多场景技术方案科学选型指南
  • OmniShotCut实战:C++/ONNX部署SOTA镜头检测,一键导出PR时间线(附开源JSX脚本)
  • 2026年COR,核密度估计增强优化:一种统计学习策略
  • 【图像分割】基于遗传算法的进化聚类技术对彩色图像进行分割附Matlab代码
  • 6款主流幼儿英语启蒙app测评,孰优孰劣一目了然
  • htmlwidgets架构优化:提升R可视化组件渲染效率的实施方法论
  • 选址避坑指南:企业如何从海量办公楼出租公司中精准锁定靠谱服务商
  • MySQL数据库迁移方案怎么选?4种方案对比+大数据量迁移避坑实战