elementui el-table表格实现翻页和搜索均保持勾选状态(后端分页)

news2025/1/17 6:09:53

需求:不管是页面切换还是通过搜索获取数据,都要保持已选中的行保持勾选状态,同时将选中行的内容以标签的形式显示出来,当点击关闭标签时可以对应取消选中状态,点击行中的任意位置也可以切换选中状态,单独勾选复选框一样可以达到要求。

由于需求相对还是蛮复杂的,直接使用row-key和reserve-selection,难以实现。所以直接通过书写代码来控制表格的勾选状态。

注意:我使用的是vue3 + ts!!!!

1. 第一步:书写html代码

给el-table添加对应勾选的监听事件,row-click用于监听鼠标选中某行时的勾选事件(不需要可去掉,我的需求是鼠标选中某行也要勾选);selection-change用于监听鼠标点击某行前面的勾选框、选中某行实现的勾选、表格左上角的全选,三种状态的事件;select用于监听框勾选数据行的 Checkbox 时触发的事件;select-all用于监听鼠标点击表格左上角的全选框。

<!-- 已选择点检项 -->
<el-row
  align="middle"
  class="selected"
  justify="space-between"
  type="flex"
>
  <el-col :span="24">
    <span>已选择:</span>
    <template v-if="selectedCheckOptions">
      <el-tag
        v-for="(item, i) in selectedCheckOptions"
        :key="i"
        closable
        :disable-transitions="false"
        @close="handleCloseTag(item, i)"
      >
        {{ item }}
      </el-tag>
    </template>
  </el-col>
</el-row>
<!-- 表格部分 -->
<el-table
  ref="multipleTableRef"
  :data="gridData"
  :header-cell-style="{
    'background-color': '#fafafa',
    color: '#000',
  }"
  size="small"
  style="width: 100%"
  @row-click="handleClickTableRow"
  @select="onTableSelect"
  @select-all="selectSingleTableAll"
  @selection-change="handleChange"
>
  <el-table-column type="selection" width="50" />
  <el-table-column fixed label="序号" type="index" width="60" />
  <el-table-column label="点检项" prop="itemName" />
  <el-table-column label="分类" prop="itemTypeName" />
</el-table>
<!-- 分页 -->
<div class="page">
  <el-pagination
    v-model:currentPage="currentPage"
    layout="total, prev, pager, next"
    small
    :total="total"
    @current-change="handleCurrentChange"
  />
</div>

2. 所需数据

// 只将表格中设计到需求的重要数据进行展示
const modelInfo = reactive({
  // 当前所在页面的表格数据
  gridData: [],
  // 添加点检项表格全部数据
  tableData: [],
  tableAllSelectedId: [] as any, // 保存表格勾选的全部id
  tableAllSelectedRow: [] as any, // 保存表格勾选的行数据
  selectedCheckOptions: [] as any, // 已选择的点检项
})

// 获取已选择的点检项
modelInfo.selectedCheckOptions = computed(() => {
  return modelInfo.tableAllSelectedRow.map((r: any) => r.itemName)
})

3.所需方法

 (1)从后台获取表格的分页数据的方法

// 获取表格数据的方法 (这里根据后端给的接口进行获取即可)
const getCheckItemData = () => {
  checkItemList({
    itemName: formInline.checkOption,
    itemTypeId: formInline.itemTypeId[formInline.itemTypeId.length - 1],
    filter: [],
    paging: {
      dir: 'DESC',
      limit: modelInfo.pageSize,
      page: modelInfo.currentPage,
      sort: 'createTime',
      start: 0,
    },
  }).then((res: any) => {
    modelInfo.gridData = res.data.records
    // 条数必须是数字才可以显示在分页控件中
    modelInfo.total = parseInt(res.data.total)
    // 关键代码(实现已勾选行数据保持选中状态)
    nextTick(() => {
      modelInfo.gridData.forEach((item: any) => {
        if (modelInfo.tableAllSelectedId.indexOf(item.itemId) > -1) {
          multipleTableRef.value?.toggleRowSelection(item, true)
        } else {
          multipleTableRef.value?.toggleRowSelection(item, false)
        }
      })
    })
  })
}

(2)当选择项发生变化时触发的方法

// 当选择项发生变化时会触发该事件
const handleChange = (val: any) => {
  // 将获取到的id存入tableAllSelectedId数组中
  val.forEach((item: any) => {
    if (modelInfo.tableAllSelectedId.indexOf(item.itemId) === -1) {
      modelInfo.tableAllSelectedId.push(item.itemId)
      modelInfo.tableAllSelectedRow.push(item)
    }
  })
}

(3)点击表格某一行的方法

// 点击表格某一行的方法
const handleClickTableRow = (row: any) => {
// 判断当前行是否已选中
  if (
    findIndexInObejctArr(
      JSON.parse(JSON.stringify(modelInfo.tableAllSelectedRow)),
      row,
      'itemId'
    ) > -1
  ) {
    const index = modelInfo.tableAllSelectedId.indexOf(row.itemId)
    modelInfo.tableAllSelectedId.splice(index, 1)
    modelInfo.tableAllSelectedRow.splice(index, 1)
    nextTick(() => {
      modelInfo.gridData.forEach((item: any) => {
        if (modelInfo.tableAllSelectedId.indexOf(item.itemId) > -1) {
          multipleTableRef.value?.toggleRowSelection(item, true)
        } else {
          multipleTableRef.value?.toggleRowSelection(item, false)
        }
      })
    })
  } else {
    multipleTableRef.value?.setCurrentRow(row)
    multipleTableRef.value!.toggleRowSelection(row, true)
  }
}

(4)勾选数据行的 Checkbox 时触发的方法

// 勾选数据行的 Checkbox 时触发的方法
const onTableSelect = (rows: any, row: any) => {
  //  判断是点击了表格勾选还是取消勾选,true为选中,0或false是取消选中
  const selected = rows.length && rows.indexOf(row) !== -1
  if (!selected) {
    // 如果点击取消勾选
    const index = modelInfo.tableAllSelectedId.indexOf(row.itemId)
    modelInfo.tableAllSelectedId.splice(index, 1) // 取消勾选,则删除id
    modelInfo.tableAllSelectedRow.splice(index, 1) // 取消勾选,则删除数据
  }
}

(5)表格全选触发的方法

// 表格全选触发的方法
const selectSingleTableAll = (selection: any) => {
  // 获取当前页码所显示的数据
  const a: any = modelInfo.gridData
  // 获取当前页勾选的数据
  const b = selection
  let flag_inCurrentPage
  selection.forEach((item: any) => {
    if (item.itemId === a[0].itemId) {
      flag_inCurrentPage = true
      return
    }
  })
  const flag = a.length === b.length && flag_inCurrentPage
  if (flag) {
    // 切换成了全选状态
    modelInfo.gridData.forEach((r: any) => {
      if (modelInfo.tableAllSelectedId.indexOf(r.itemId) === -1) {
        modelInfo.tableAllSelectedId.push(r.itemId) // 如果点击全选就保存全部id
        modelInfo.tableAllSelectedRow.push(r) //如果点击全选就保存全部数据
      }
    })
  } else {
    // 切换成了非全选状态
    modelInfo.tableAllSelectedId = []
    modelInfo.tableAllSelectedRow = []
  }
}

(6)查找对象在对象数组中位置的方法

// 查找对象在对象数组中的位置
findIndexInObejctArr: function(arr, obj) {
  for (let i = 0, iLen = arr.length; i < iLen; i++) {
    if (arr[i].deliverId === obj.deliverId) {
       return i
    }
  }
  return -1
}

(7)删除标签的方法

// 删除标签的方法
const handleCloseTag = (tag: string, index: number) => {
  // 先删除保存表格勾选的全部行数据中对应的数据,以及保存表格勾选的全部行id中对应的数据
  modelInfo.tableAllSelectedId.splice(index, 1)
  modelInfo.tableAllSelectedRow.splice(index, 1)
  // 再根据已勾选的全部id来将对应行选中
  nextTick(() => {
    modelInfo.gridData.forEach((item: any) => {
      if (modelInfo.tableAllSelectedId.indexOf(item.itemId) > -1) {
        multipleTableRef.value?.toggleRowSelection(item, true)
      } else {
        multipleTableRef.value?.toggleRowSelection(item, false)
      }
    })
  })
}

(8)切换页码的方法

const handleCurrentChange = (val: number) => { 
   modelInfo.currentPage = val
   getCheckItemData()
}

(9)查询方法

// 搜索方法
const onSearch = () => {
  modelInfo.currentPage = 1
  getCheckItemData()
}

(10)确认添加的方法(由于我的表格是出现在弹出层中的,故增加了此方法,该方法和本文章的需求无关,可以直接忽视)

// 确认添加点检项的方法
const confirmAdd = () => {
  modelInfo.checkOptions = modelInfo.tableAllSelectedRow
  dialogAddVisible.value = false
  // 清除搜索内容
  formInline.checkOption = ''
  formInline.itemTypeId = []
  modelInfo.currentPage = 1
  getCheckItemData()
}

4.效果图

 (1)选中的会在上面同步显示

 

(2)跨行也能保留选中状态和标签

 

(3)搜索也一样能保留选中状态

借鉴:elementui el-table表格实现跨页(翻页)保存勾选状态(后端分页)_公孙元二的博客-CSDN博客_el-table跨页勾选 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

柳叶刀重磅:30年来首个基于新机制的降压药,可持续降压近一年

全球范围内高血压患者约有13亿&#xff0c;其中10%的患者&#xff08;超过1亿&#xff09;为难治性高血压&#xff0c;即接受了3种以上不同种类的降压药治疗后&#xff0c;血压仍然控制不佳。长期不受控的高血压可能对心脏和血管均会造成损伤&#xff0c;进而增加患者发生心脏病…

Learning Saliency Propagation for Semi-Supervised Instance Segmentation

Abstract 实例分割对于建模和注释来说都是一项具有挑战性的任务。由于注释成本高&#xff0c;建模变得更加困难&#xff0c;因为监督的数量有限。我们的目标是利用大量的检测监督来提高现有实例分割模型的准确性。我们提出了ShapeProp&#xff0c;它学习激活对象检测中的显著区…

【CocosCreator入门】CocosCreator下载安装 | 使用Cocos DashBoard下载各个版本的CocosCreator

Cocos Creator 从 v2.3.2 开始接入了全新的 Dashboard 系统&#xff0c;能够同时对多版本引擎和项目进行统一升级和管理&#xff01;Cocos Dashboard 将做为 Creator 各引擎统一的下载器和启动入口&#xff0c;方便大家升级和管理多个版本的 Creator。此外还集成了统一的项目管…

进程间通信的方式(附代码分析)

进程间通信的方式 1. 进程间通信的几种方式 管道 比如 ls | grep 1;也就是将 进程 ls 拿到的结果作为 grep 1 这个进程的输入。实现了进程间的通信。 消息队列 消息队列就是我们的内核给我们创建的一种消息队列。我们可以往其中发送消息&#xff0c;也可以从其中接收消息。 …

C语言实现有序序列判断

一个数组&#xff0c;判断是否有序看上去很简单&#xff0c;有很多种方法。但实际上有一个很严重的问题&#xff0c;就是重复数会影响判断结果。 我这里提供的思路是取连续的三个数进行比较&#xff0c;a, b, c&#xff0c;假设一共n个元素&#xff0c;数组名是arr&#xff0c…

阿里云Imagine Computing创新技术大赛决赛启幕!

2023年1月&#xff0c;由阿里云与英特尔主办&#xff0c;阿里云天池平台、边缘云、视频云共同承办的“新算力 新体验”Imagine Computing创新技术大赛复赛圆满落幕。经过两个多月的激烈角逐&#xff0c;12支入围队伍&#xff0c;从海内外8个国家和地区的6900余支参赛队伍中脱颖…

转到结构化写作后的几点变化

或许是随着公司产品越来越多&#xff0c;公司的手册越来越复杂&#xff0c;用户越来越难找到需要的信息&#xff1b;或许是因为公司管理手册的使用者不满足于长篇大论的文字&#xff0c;希望能够获得只跟他相关的政策、程序等信息。 总之&#xff0c;公司决定从MS Word、非结构…

Pipeline机器学习模型串联

机器学习模型训练时使用 Pipeline 是一个加快效率的串联方法。Pipeline 处理机制就像是把所有模型塞到一个管子里&#xff0c;然后依次对数据进行处理&#xff0c;得到最终的分类结果。 # 模型串联 pipPipeline( [ # 所有模型写…

Matlab Spreadsheet Link安装(早期叫excllink)

我们在Matlab和Excel之间进行数据交互&#xff0c;需要用到Excel link这个组件&#xff08;这是早期的叫法&#xff09;&#xff0c;现在这个组件的名称叫做Spreadsheet Link&#xff0c;这个在我们安装Matlab的时候&#xff0c;要选择相应的组件来安装&#xff08;有可能我们刚…

find命令的常见用法

1.find 命令的常见用法 1.1 基础的打印操作 find命令默认接的命令是-print&#xff0c;它默认以\n将找到的文件分隔。可以使用-print0来使用\0分隔&#xff0c;这样就不会分行了。但是一定要注意&#xff0c;-print0针对的是\n转\0&#xff0c;如果查找的文件名本身就含有空格…

高一物理题整理

1 船过河问题 【分析及解答】 这个题的关键是如何理解船的速度&#xff0c;题目假设船的速度是不变的&#xff0c;也就是一直是v2v_2v2​。 列方程如下&#xff1a; {120v1∗10dv2∗10dv2sin⁡θ∗12.5v1v2cos⁡θ\left\{\begin{array}{l} 120 v_1 * 10 \\ d v_2 * 10 \\ d …

【我的渲染技术进阶之旅】解决Cinema 4D制作的3D模型无法导入Blender的问题

文章目录一、问题描述二、分析问题2.1 查看material材质的mtl文件2.2 mtl文件介绍2.3 对比mtl文件和mtl语法并修改2.3.1 norm不对2.3.2 map_Ka、map_Kd 、map_Ks、map_Bump 的格式不对2.5 重新导出obj格式和mtl文件三、总结一、问题描述 今天UI输出了个3D模型给我&#xff0c;…

Spring是如何解决循环依赖的?

一、什么是循环依赖&#xff1f; 循环依赖&#xff1a;说白了就是一个或多个对象实例之间存在直接或间接的依赖关系&#xff0c;这种依赖关系构成了一个环形调用。 第一种情况&#xff1a;自己依赖自己的直接依赖 第二种情况&#xff1a;两个对象之间的直接依赖 第三种情况…

Android 深入系统完全讲解(11)

9 framework 内容组成 狭义的 framework&#xff0c;主要讲的就是 SystemServer 里面的所有服务&#xff0c;这些是在 framework&#xff0c; 而广义的就是包含了 rec&#xff0c;native 服务&#xff0c;系统 app 等一切分不出去的模块&#xff0c;所以 framework 要能做好&a…

睿尔曼 RM65-B 机械臂 WIN 示教软件测试

大家好&#xff0c;我是虎哥&#xff0c;最近开始接触机械臂&#xff0c;尤其是协作机械臂&#xff0c;小&#xff0c;轻、还价格便宜一点&#xff0c;由于我师兄弟强烈推荐的睿尔曼 RM65-B机械臂&#xff0c;所以总结一下自己的开箱测试经验&#xff0c;主要是在WIN下 示教器软…

Protobu编译本地环境搭建

1 windows下安装Protobuhttps://github.com/protocolbuffers/protobuf/releases2 安装cmakehttps://cmake.org/download/3选择选择你的VS版本4生成pb运行程序5 protoc --cpp_out生产pb文件将刚才编译后的libprotobufd.lib和protoc.exe拷贝到自己创建的项目下&#xff0c;按住sh…

express中间件

文章目录中间件定义一个最简单的中间件自定义中间件中间件的五个使用注意事项Express 基于 Connect 构建而成&#xff0c;因此&#xff0c;它也保持了重用中间件来完成基础任务的想法。这就意味着&#xff0c;通过 Express 的 API 方便地构建 Web 应用地同时&#xff0c;又不失…

基于vgg16和pytorch框架进行cifar10数据集的图像分类

vgg16网络模型的实现 这里只讲怎么实现 百度搜到vgg16的网络模型图&#xff0c;用pytorch框架进行实现 图是这样&#xff0c;用pytorch实现就行&#xff0c;pyotrch不太熟悉的话可以去看小土堆的视频 命名mode.py 也可以使用其他名字&#xff0c;在后面的train.py里面改一下也…

【C语言进阶】内存函数和结构体内存对齐

目录一.strerror函数1.错误码变量errno2.strerror函数的使用3.perror函数二.memcpy函数1.函数介绍2.模拟实现三.memmove函数1.函数介绍2.模拟实现四.结构体的内存对齐一.strerror函数 1.错误码变量errno 规定: C语言库函数如果出现运行错误&#xff0c;会将对应错误信息的错误…

联邦学习 (FL) 中常见的3种模型聚合方法的 Tensorflow 示例

联合学习 (FL) 是一种出色的 ML 方法&#xff0c;它使多个设备&#xff08;例如物联网 (IoT) 设备&#xff09;或计算机能够在模型训练完成时进行协作&#xff0c;而无需共享它们的数据。 “客户端”是 FL 中使用的计算机和设备&#xff0c;它们可以彼此完全分离并且拥有各自不…