在vue和element-ui的table中实现分页复选功能


Posted in Javascript onDecember 04, 2019

背景

后台管理系统中,使用表格展示数据时,可能的需求是多项选择然后进行批量操作,也期望能翻页多选。

实现

在vue和element-ui的table中实现分页复选功能 

页面结构如下

<el-table
 class="table"
 :data="tableData"
 border
 style="width: 100%"
 @selection-change="handleSelectionChange"
 ref="asTable"
>
 <el-table-column
 width="50"
 type="selection"
 fixed="left"
 >
 </el-table-column>
 <el-table-column
 prop="id"
 label="ID"
 >
 </el-table-column>
 <el-table-column
 prop="name"
 label="名字"
 >
 </el-table-column>

 <el-table-column
 label="操作"
 width="100"
 >
 <template slot-scope="scope">
  <el-button type="primary" plain size="small" @click="handleEdit(scope.row)" >编辑</el-button>
 </template>
 </el-table-column>
</el-table>
<el-pagination
 background
 @current-change="handleCurrentChange"
 :current-page.sync="pagination.currentPage"
 :page-size="pagination.size"
 layout="total, prev, pager, next, jumper"
 :total="pagination.total"
 slot="pagination"
>
</el-pagination>

模拟数据实现分页

data () {
 return {
 tableData: [],
 multipleSelection: [],
 pagination: {
  currentPage: 1,
  size: 10,
  total: 1000
 }
 }
},
beforeMount () {
 this.fetchData()
},
methods: {
 fetchData () {
 this.tableData = []
 let start = (this.pagination.currentPage - 1) * this.pagination.size
 let end = this.pagination.currentPage * this.pagination.size
 setTimeout(_ => {
  for (let i = start; i < end; i++) {
  this.tableData.push({
   id: i,
   name: `王${i}兰`
  })
  }
 }
 },
 handleCurrentChange () {
 this.fetchData()
 },
 handleSelectionChange (val) {
 this.multipleSelection = val
 },
}

展示已选择项

<div class="result">
 已选:{{ allMultipleSelection }}
</div>
allMultipleSelection: [],

在复选事件中对所选项进行存储

主要思路就是:

  • 将当前页已选数据放入所有已选项
  • 将所有已选项数据中当前页没选择的项移除
handleSelectionChange (val) {
 this.multipleSelection = val
 // @tip 实现分页复选
 console.log(val, 'selection')
 setTimeout(_ => {
 this.resolveAllSelection()
 }, 50)
},
resolveAllSelection () {
 let currentPageData = this.tableData.map(item => item[this.uniqueKey]) // 当前页所有数据
 let currentPageSelected = this.multipleSelection.map(item => item[this.uniqueKey]) // 当前页已选数据
 let currentPageNotSelected = currentPageData.filter(item => !currentPageSelected.includes(item)) // 当前页未选数据
 // 将当前页已选数据放入所有已选项
 currentPageSelected.forEach(item => {
 if (!this.allMultipleSelection.includes(item)) {
  this.allMultipleSelection.push(item)
 }
 })
 // 将所有已选项数据中当前页没选择的项移除
 currentPageNotSelected.forEach(item => {
 let idx = this.allMultipleSelection.indexOf(item)
 if (idx > -1) {
  this.allMultipleSelection.splice(idx, 1)
 }
 })
 console.log(this.allMultipleSelection, 'all')
},

此时还需要在切换页面时将之间选择项进行重新选中,即遍历当前页所有数据如果存在于所有已选项中,则将其置为已选择。

fetchData () {
 // ...
 setTimeout(_ => {
 // ...
 // @tip 实现分页复选
 setTimeout(_ => {
  this.setSelectedRow()
 }, 50)
 }, 200)
},
setSelectedRow () {
 // 设置当前页已选项
 this.tableData.forEach(item => {
 if (this.allMultipleSelection.includes(item[this.uniqueKey])) {
  this.$refs.asTable.toggleRowSelection(item, true)
  console.log(item[this.uniqueKey], 'set')
 }
 })
},

在vue和element-ui的table中实现分页复选功能 

以上实现了分页复选功能。

所有代码存放在 @careteen/lan-vue

查看DEMO

clone仓库并引入依赖

git clone git@github.com:careteenL/lan-vue.git
npm install
npm run serve

浏览器打开 http://localhost:8080/#/examples/pagingCheck 即可看到效果

总结

以上所述是小编给大家介绍的在vue和element-ui的table中实现分页复选功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
javascript实现的动态添加表单元素input,button等(appendChild)
Nov 24 Javascript
一个简单的javascript类定义例子
Sep 12 Javascript
为指定元素增加样式的js代码
Dec 09 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
Sep 06 Javascript
Script的加载方法小结
Jan 12 Javascript
js 优化次数过多的循环 考虑到性能问题
Mar 05 Javascript
JavaScript中创建对象和继承示例解读
Feb 12 Javascript
javascript获取元素偏移量的方法有哪些
Jun 24 Javascript
js实现的下拉框二级联动效果
Apr 30 Javascript
Javascript删除指定元素节点的方法
Jun 21 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
Dec 06 Javascript
js实现简单的贪吃蛇游戏
Apr 23 Javascript
vue项目中极验验证的使用代码示例
Dec 03 #Javascript
jQuery轮播图功能制作方法详解
Dec 03 #jQuery
JS实现的雪花飘落特效示例
Dec 03 #Javascript
vue中实现高德定位功能
Dec 03 #Javascript
node静态服务器实现静态读取文件或文件夹
Dec 03 #Javascript
js实现时分秒倒计时
Dec 03 #Javascript
Vue实现验证码功能
Dec 03 #Javascript
You might like
风格模板初级不完全修改教程
2006/10/09 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
分享50个提高PHP执行效率的技巧
2015/12/26 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
php和C#的yield迭代器实现方法对比分析
2019/07/17 PHP
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
js中判断用户输入的值是否为空的简单实例
2013/12/23 Javascript
js点击选择文本的方法
2015/02/09 Javascript
纯JS实现旋转图片3D展示效果
2015/04/12 Javascript
详解AngularJS中的依赖注入机制
2015/06/17 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
JS判断是否长按某一键的方法
2016/03/02 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
turn.js异步加载实现翻书效果
2019/07/25 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
js实现随机点名
2021/01/19 Javascript
Python学习pygal绘制线图代码分享
2017/12/09 Python
python使用KNN算法识别手写数字
2019/04/25 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
DELPHI面试题研发笔试试卷
2015/11/08 面试题
建筑设计所实习生自我鉴定
2013/09/25 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
投资意向书范本
2014/04/01 职场文书
争先创优公开承诺书
2014/08/30 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
交通事故责任认定书
2015/08/06 职场文书
售房协议书范本
2015/08/11 职场文书
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android