第四十四节:封装通用表格多选、批量操作组合式函数

第四十四节:封装通用表格多选、批量操作组合式函数

🎯本节目标

  1. 抽离表格多选逻辑,复用在用户、角色、部门等所有列表页面
  2. 自动维护选中行数组,获取选中 id 集合,清空选中状态
  3. 配合批量删除、批量修改状态等业务,不用每个页面重复写 selection 相关代码

步骤 1:新建 src/composables/useTableSelection.js

复制代码
import { ref } from 'vue'

export function useTableSelection() {
  // 选中的全部行数据
  const selectedRows = ref([])

  // 多选框选中变化回调
  const handleSelectionChange = (rows) => {
    selectedRows.value = rows
  }

  // 获取选中行的id数组(常用,传给后端批量接口)
  const getSelectedIds = (key = 'id') => {
    return selectedRows.value.map(item => item[key])
  }

  // 清空表格选中
  const clearSelection = (tableRef) => {
    selectedRows.value = []
    if (tableRef?.value) {
      tableRef.value.clearSelection()
    }
  }

  return {
    selectedRows,
    handleSelectionChange,
    getSelectedIds,
    clearSelection
  }
}

步骤 2:用户列表页面引入使用 src/views/system/user/user.vue

复制代码
<template>
  <PageCard title="用户管理">
    <!-- 搜索区域省略 -->
    <div class="mb-10">
      <el-button v-perm="'system:user:add'" type="primary" @click="openAdd()">新增用户</el-button>
      <el-button v-perm="'system:user:remove'" type="danger" @click="batchDelete">批量删除</el-button>
    </div>

    <el-table
      ref="tableRef"
      :data="tableData"
      @selection-change="handleSelectionChange"
      border
    >
      <!-- 多选列 -->
      <el-table-column type="selection" width="55" />
      <el-table-column label="用户名" prop="username" />
      <el-table-column label="手机号" prop="phone" />
      <el-table-column label="操作">
        <template #default="scope">
          <el-button @click="openEdit(scope.row)">编辑</el-button>
          <el-button type="danger" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>

    <!-- 分页组件省略 -->
  </PageCard>
</template>

<script setup>
import { ref } from 'vue'
import { useTableSelection } from '@/composables/useTableSelection'
import { useMsg } from '@/composables/useMsg'
const { msgSuccess, msgWarning, msgConfirm } = useMsg()

const tableRef = ref(null)
const { selectedRows, handleSelectionChange, getSelectedIds, clearSelection } = useTableSelection()

// 批量删除
const batchDelete = async () => {
  const ids = getSelectedIds('id')
  if (ids.length === 0) {
    msgWarning('请勾选至少一条数据')
    return
  }
  try {
    await msgConfirm('批量删除', `确定删除选中${ids.length}条记录吗?`)
    // 调用批量删除接口:await batchDelUserApi({ ids })
    msgSuccess('批量删除成功')
    getList()
    // 删除成功清空表格选中状态
    clearSelection(tableRef)
  } catch (err) {
    console.log('取消批量删除')
  }
}

// 其余原有逻辑:getList、单行删除、新增编辑...
defineOptions({
  name: 'UserList'
})
</script>

✅ 方法说明

  1. handleSelectionChange:直接绑定 el-table 的 @selection-change,自动收集勾选的行
  2. getSelectedIds('id'):快速拿到选中数据的 id 数组,传给后端批量接口;主键不是 id 可以传其他字段,如getSelectedIds('deptId')
  3. clearSelection(tableRef):清空勾选,分页切换 / 删除成功后调用

✅测试清单

  1. 进入用户管理页面,勾选多条数据
  2. 点击批量删除,弹窗提示选中条数
  3. 确认删除,列表刷新并且多选框自动清空
  4. 不勾选任何数据直接点批量删除,弹出警告提示
  5. 切换分页,多选状态会清空(element-plus 原生行为,如需跨页保存选中可自行扩展)

常见坑

  1. tableRef 必须传递给 clearSelection,否则页面上勾选框不会取消勾选
  2. 跨页保留选中是进阶需求,当前版本默认不处理,适合绝大多数后台系统
  3. 批量接口后端一般接收数组ids:[1,2,3],getSelectedIds直接生成
相关推荐
liangshanbo121513 分钟前
JavaScript 面试题:Object.keys() 的返回顺序是无序的吗?
开发语言·javascript·ecmascript
geovindu25 分钟前
css: Timeline scribble
前端·css·iphone
沙漠之主9 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
hasty9 小时前
不上传新包,也能改变用户拿到的版本:npm dist-tag 的 OIDC 权限治理
前端·npm·node.js
Csvn9 小时前
diff 算法(虚拟 DOM Reconciliation)
前端
前端snow10 小时前
ai agent --- 文件存储
前端
Frag0ut10 小时前
Chrome四大版本获取及共存指南:Stable/Beta/Dev/Canary
前端·chrome·浏览器·dev·beta·canary·共存版
IT_陈寒12 小时前
SpringBoot自动配置坑了我一把,原来是这样绕过去的
前端·人工智能·后端
广州华水科技12 小时前
单北斗GNSS变形监测在大坝安全监测中的应用与优势
前端
zeng不错12 小时前
B站 173 个投稿活动看到眼瞎?我写了个扩展,主打一个精准打击
前端