Vue3 ElementUI框架的表格复选问题

文章讲述了在Vue3项目中使用ElementUI框架时遇到的表格分页复选问题,作者分享了两种解决方案,包括使用Map记录选中状态和使用Vue实例变量保存选中数据,以应对不同业务场景下的数据同步和效率问题。

Vue3 ElementUI框架的表格复选问题

在项目中使用el-table使用复选框选择的时候我看官方文档似乎并没有解决分页表格复选的问题,也没有给出代码示例,我花了很多时间来想这个问题,最终找到了解决方案,下面这是官方文档的截图,用到的也就是下面的这三个方法:

image-20240301145010121

方案1:

作为一个全栈,我其实第一想法就是想到使用Map来记录每一页的选中状态,这样无论用户如何选择,都可以很完美的记录下当前页有哪些值被选中,做法也很简单,就是使用key:value的形式来实现,key就是currentPage、value就是数组,然后使用初始化的方式,先将数组中的每个值都写成0,然后将已经选中的值改成1,但是有个效率问题,每次翻页或者每次切换页大小的时候都可能需要去重新初始化这个中间记录值,对于前端来说存在一个很大的效率问题。

方案2:

使用下列代码,适用业务场景(用户点击弹窗->加载第一页数据->如果存在原始数据需要将原始数据勾选在列表中->用户可以选择勾选数据,用户也可以对原有已经选中的数据进行取消勾选。 用户在当前页勾选后,可以切换到其他页进行勾选,并且在页面切换之间,已勾选的数据不会存在丢失的情况。-> 当用户点击确定的时候关闭弹窗,并且将选择的内容最终展现在列表上)

1.记录当前选中值

/**
单选或多选都可用 select 和select-all的回调都是一样的   
使用的是vue3
tempProdNumList 是中间变量,类似于缓存记录一下当前用户选中了哪些值
it.relateNumber == item.relateNumber 这里的判断条件需要根据实际业务场景来
prodTableData 是当前页的表格数据
2024/03/05 更新 currentPageSelect 记录当前页选中的集合
**/
const prodChangeSelect = (value)=>{
  value.forEach((item)=>{
    if(!currentPageSelect.value.includes(item)){
      // 代表这条记录是新增的
      currentPageSelect.value.push(item)
    }
  })
  const oldCurrent = cloneDeep(currentPageSelect.value)   // 先暂存一下当前页已经选中的防止丢失
  // 过滤那些选中被取消的
  currentPageSelect.value = currentPageSelect.value.filter((item)=>value.includes(item))
  const tempData2 = cloneDeep(tempProdNumList.value)
  if(value.length > 0){
    // 当前页有记录
    if(tempData2.length > 0){
      prodTableData.value.forEach((item)=>{
        const index = findIndex(tempData2,(it)=>it.relateNumber == item.relateNumber)
        if(index > -1){
          tempData2.splice(index,1)
        }
      })
    }
  }else if(value.length == 0){
    // 特殊处理当前页清空选择的情况
    oldCurrent.forEach((item)=>{
				const findRes =  currentPageSelect.value.find((it)=>it.relateNumber == item.relateNumber)
        if(!findRes){
          tempData2 = tempData2.filter((tempItem)=>tempItem.relateNumber !== item.relateNumber)
        }
    })
	}
  tempProdNumList.value = tempData2.concat(value)  // 关键的一行
}

这里需要注意,单选和全选事件都需要调用这个方法来确保其正常使用。

2.回显数据

/**
clearSelection() 以及 toggleRowSelection(item,true) 这两个方法可以百度一下文档看看
**/
const echoProdData = () =>{
  currentPageSelect.value = []
  relateProdTable.value.baseTable.clearSelection()  // 这个主要是用于清空当前页的所有选中状态,具体的需要根据代码判断,我这里是封装了表格
  prodTableData.value.forEach((item)=>{
    const tempCont = tempProdNumList.value.find((it)=>it.relateNumber == item.relateNumber)
    if(tempCont){
      relateProdTable.value.baseTable.toggleRowSelection(item,true)
      currentPageSelect.value.push(item)  // 回显数据的时候记录当前页的值
    }
  })
}

最重要的其实就是上面两步,剩下的代码主要是配合上面的代码

3.其他需要的代码

/**
	点击打开弹框
**/
const addProd = ()=>{
  // 初始化查询条件以及打开弹框
  ...
  tempProdNumList.value = cloneDeep(prodInfoData.value.prodductList)  // 最重要的一步,每次打开弹框的时候,都需要记录一遍原始数据
  getProdInfoList() // 查询数据接口
}
/**
	还需要注意的点:
	1.查询数据接口的时候 需要在返回后调用回显数据的方法,确保不论是打开弹框还是分页都能将勾选反显.
	2.确认选择的时候需要将   prodInfoData.value.prodductList = cloneDeep(tempProdNumList.value)  副本数据给正式数据

**/
### 实现ElementUI表格组件中的复选框选择 在Vue2与Element-UI框架下开发时,为了使`el-table`具备树形结构并带有复选框的选择功能,可以按照如下方式构建: #### 初始化配置 确保安装了最新版本的Vue以及Element-UI库之后,在项目中引入必要的样式文件和脚本。 ```javascript import Vue from &#39;vue&#39;; import ElementUI from &#39;element-ui&#39;; import &#39;element-ui/lib/theme-chalk/index.css&#39;; Vue.use(ElementUI); ``` #### 创建具有复选框的树形表格 定义一个包含嵌套对象数组的数据源来模拟树形结构,并通过`el-table-column`标签内的属性指定列类型为`selection`以启用多选模式[^1]。 ```html <template> <div id="app"> <!-- 定义表头 --> <el-button @click="toggleSelection()">全选/取消</el-button> <el-table :data="tableData" row-key="id" default-expand-all border style="width: 100%"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="label" label="名称"></el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableData: [ { id: 1, pid: null, label: "一级分类", children: [{ id: 2, pid: 1, label: "二级分类A" }, { id: 3, pid: 1, label: "二级分类B" }] }, { id: 4, pid: null, label: "另一级分类", children: [] } ] }; }, methods: { toggleSelection(rows) { if (rows) { rows.forEach(row => this.$refs.multipleTable.toggleRowSelection(row)); } else { this.$refs.multipleTable.clearSelection(); } } } }; </script> ``` 上述代码片段展示了如何创建一个简单的树形表格,并为其添加了一个按钮用于触发全选或清除所有选项的操作。注意这里使用到了`row-key`属性指定了唯一标识符字段名以便正确处理父子关系;而`default-expand-all`则让所有的节点默认展开显示。 对于更复杂的场景比如懒加载子项或者分页等功能,则需进一步自定义逻辑和服务端交互部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

露露唯一真爱粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值