el-table分页多选及回显方式

 更新时间:2026年01月22日 10:37:59   作者:四木Zhang  
这篇文章主要介绍了el-table分页多选及回显方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

使用e-table分页多选,回显

很多次碰到要做表格多选加分页的,在这里记录一下

主要需求

  • 表格要求可以多选,可以分页
  • 选择数据之后,切换分页数据仍存在,再次切换回去,能正常回显

功能展示

左侧为table表格,右侧是已选择的展示

  • 首页选择人员

  • 第二页选择人员,第一页选择的数据仍在

  • 切换回第一页,正常回显数据

  • 选择的数据传递到界面

  • 再次打开弹窗,数据仍正常回显

具体实现

首先,给表格添加分页与选择功能

<!-- table表头设置row-key,需要唯一标识 -->
<el-table :row-key="(row) => { return row.userId }" ></el-table>
    
<!-- 添加多选,设置type="selection" -->
<el-table-column type="selection" width="55" :reserve-selection="true">
</el-table-column>

<!-- 添加分页组件 -->
<el-pagination :page-sizes="[10, 50, 100]" :currentpage="Number(form.pageNum)" :page-size="Number(form.pageSize)" :total="Number(form.total)" layout="prev,pager,next,sizes,jumper" @size-change="onSizeChange"
@current-change="onCurrentChange" />

表格做了分页功能,切页会请求后台,之前选择的的数据的勾选状态就不存在了,element提供了reserve-selection可以保存数据更新前选中的值,这个属性需要搭配 row-key 指定一个唯一标识。所以要在表格多选列设置reserve-selection='true'

当设置了row-key和reserve-selection基本就成了

使用selection-change函数记录勾选的值

  • selection-change:当选项发生变化时会触发该函数
<el-table @selection-change="handleSelectionChange" ></el-table>

//selectList为勾选的值组成的数组
handleSelectionChange(arr) {
      this.selectList = arr
}

回显数据:

通过element提供的内置函数toggleRowSelection()来实现我们的数据回显

//给table设置ref属性
<el-table ref="multipleTable" :data="tableData"></el-table>

//数据回显
toggleSelection(rows) {
    //使用$nextTick,保证dom已经更新
    this.$nextTick(() => {
        setTimeout(() => {
            //保证有值再进行比对,避免报错
            if (rows && this.tableData.length != 0) {
                //遍历table表格数据与要回显的数组比对,匹配成功的设置为选中状态
                this.tableData.forEach((row) => {
                    rows.forEach((item) => {
                        if (row.userId == item.userId) {
                            //判断唯一标识,若是id一样,则设置该行选中状态为true
                            this.$refs.multipleTable.toggleRowSelection(row, true)
                        }
                    })
                })
            } else {
                this.$refs.multipleTable.clearSelection();
            }
        }, 0);
    });
}

注意:因为我们这里做了分页,分页时会重新请求后台,所以每次请求后要调用一次toggleSelection函数来回显当前页的数据

  • 至此,我们表格的分页多选回显功能就做的差不多了

完整代码

  • 仅供参考
<el-table :data="tableData" @row-click="rowClick" @selection-change="handleSelectionChange" ref="multipleTable" stripe border style="width: 100%" :row-key="(row) => { return row.userId }" height="calc(100% - 48px)">
	<el-table-column type="selection" width="55" :reserve-selection="true">
    </el-table-column>
    <el-table-column type="index" label="序号" align="center" width="50px">
        <template slot-scope="scope">
            {{ (form.pageNum - 1) * form.pageSize + scope.$index + 1 }}
         </template>
     </el-table-column>
     <el-table-column align="center" label="姓名" prop="userName" />
</el-table>
<el-pagination :page-sizes="[50, 100, 1000, 2000]" :current-page="Number(form.pageNum)"  :page-size="Number(form.pageSize)" :total="Number(form.total)" layout="prev,pager,next,sizes,jumper" @size-change="onSizeChange"  @current-change="onCurrentChange" />

<script>
export default {
	data() {
        return {
            tableData: [],//表格table
            form: {
                pageNum: 1,
                pageSize: 50,
                total: 0,
            },
            selectList: [],//选中的list
        };
    },
    mounted() {
        this.getList()
    },
    methods: {
        // 获取列表
        async getList() {
            let { rows, total } = await user_list(this.form);
            this.tableData = rows;
            this.form.total = total
            this.toggleSelection(this.selectList)
        },
        // 选择人员发生变化时
        handleSelectionChange(arr) {
            this.selectList = arr
        },
        // 数据回显
        toggleSelection(rows) {
            this.$nextTick(() => {
                setTimeout(() => {
                    if (rows && this.tableData.length != 0) {
                        this.tableData.forEach((row) => {
                            rows.forEach((item) => {
                                if (row.userId == item.userId) { this.$refs.multipleTable.toggleRowSelection(row, true)
                                }
                            })
                        })
                    } else {
                        this.$refs.multipleTable.clearSelection();
                    }
                }, 0);
            });
        },
        //分页
        onSizeChange(size) {
            this.form.pageSize = size
            this.getList();
        },
        onCurrentChange(current) {
            this.form.pageNum = current
            this.getList();
        },
    },
}   
</script>

补充

做好之后,发现是存在一些bug的

初次数据回显时,会触发handleSelectionChange函数,导致传入的list被覆盖修改,切换分页时后面的数据已经不存在了

  • 解决方案:data中添加一个flag变量来判断编辑回显
falg:false,
    
handleSelectionChange(arr) {
    if (this.falg) return
    this.selectList = arr
},
toggleSelection(rows) {
    this.$nextTick(() => {
        setTimeout(() => {
            this.rowSelectFlag = true
            ... 
            this.rowSelectFlag = false
        }, 0);
    });
},

回显数据后进行修改数据,只会保存当前页的数据,其他分页的数据被刷掉

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue3如何定义全局组件

    vue3如何定义全局组件

    本文介绍了如何在Vue3中注册和使用全局组件,并解决了通过template定义组件时出现的警告问题,具体方法是在vite.config.js文件中配置Vue构建版本为vue.esm-bundler.js,以支持运行时编译,此操作确保全局组件可以正常工作并解决了编译警告
    2024-10-10
  • Vuex中的State使用介绍

    Vuex中的State使用介绍

    今天小编就为大家分享一篇关于Vuex中的State使用介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • vuecli4中如何配置打包使用相对路径

    vuecli4中如何配置打包使用相对路径

    这篇文章主要介绍了vuecli4中如何配置打包使用相对路径,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • vue中Bootstrap的详细使用方法

    vue中Bootstrap的详细使用方法

    Bootstrap适用于快速搭建简单网站或Web应用程序的情况,而Vue.js适用于构建复杂的单页面应用程序,根据您的项目需求和开发方式,您可以选择使用Bootstrap、Vue.js或两者结合使用,这篇文章主要介绍了vue使用Bootstrap的详细方法,需要的朋友可以参考下
    2023-08-08
  • vue实现组件切换效果的三种功能

    vue实现组件切换效果的三种功能

    这篇文章主要为大家介绍了在Vue中实现组件切换的三种方法,即使用条件渲染,使用动态组件以及通过点击按钮切换组件,有需要的小伙伴可以了解下
    2024-11-11
  • 在Vue3项目中集成CodeMirror创建SQL编辑器的方法详解

    在Vue3项目中集成CodeMirror创建SQL编辑器的方法详解

    在这篇文章中,我们将学习如何在 Vue 3 项目中集成 CodeMirror,以创建一个支持 SQL 语法高亮和自动补全的代码编辑器,需要的朋友可以参考下
    2025-04-04
  • Vue3实现简易音乐播放器组件

    Vue3实现简易音乐播放器组件

    这篇文章主要为大家详细介绍了Vue3实现简易音乐播放器组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 详解Vue全局组件的挂载之实现弹窗组件

    详解Vue全局组件的挂载之实现弹窗组件

    这篇文章主要为大家详细介绍了如何通过Vue全局组件的挂载来实现弹窗组件,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的可以了解一下
    2022-11-11
  • 前端vue2 element ui高效配置化省时又省力

    前端vue2 element ui高效配置化省时又省力

    这篇文章主要为大家介绍了前端高效配置化vue2 element ui省时又省力,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Vite3 Svelte3构建Web应用报错process is not defined

    Vite3 Svelte3构建Web应用报错process is not def

    这篇文章主要介绍了Vite3 Svelte3构建Web应用报错:'process is not defined'解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论