在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 相关文章推荐
JQuery团队打造的javascript单元测试工具QUnit介绍
Feb 26 Javascript
JavaScript 高效运行代码分析
Mar 18 Javascript
jquery 使用点滴函数代码
May 20 Javascript
使用jquery实现select添加实现后台权限添加的效果
May 28 Javascript
JS网页播放声音实现代码兼容各种浏览器
Sep 22 Javascript
javascript与cookie 的问题详解
Nov 11 Javascript
javascript函数作用域学习示例(js作用域)
Jan 13 Javascript
分享纯手写漂亮的表单验证
Nov 19 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
AngularJS HTML DOM详解及示例代码
Aug 17 Javascript
使用jquery给新生的th绑定hover事件的实例
Feb 10 Javascript
7个好用的JavaScript技巧分享(译)
May 07 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
谈谈PHP语法(2)
2006/10/09 PHP
php更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
js获取内联样式的方法
2015/01/27 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
python翻译软件实现代码(使用google api完成)
2013/11/26 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
详解django2中关于时间处理策略
2019/03/06 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
Spring http服务远程调用实现过程解析
2020/06/11 Python
keras输出预测值和真实值方式
2020/06/27 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
大学毕业生的自我鉴定
2013/11/30 职场文书
本科生自荐信
2014/06/18 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
2015年销售人员工作总结
2015/04/07 职场文书
MySQL数据库必备之条件查询语句
2021/10/15 MySQL