在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 API学Jquery 之三 筛选
Apr 09 Javascript
jquery学习笔记 用jquery实现无刷新登录
Aug 08 Javascript
js字符串截取函数substr substring slice使用对比
Nov 27 Javascript
通过复制Table生成word和excel的javascript代码
Jan 20 Javascript
Javascript动态引用CSS文件的2种方法介绍
Jun 06 Javascript
JS生成不重复随机数组的函数代码
Jun 10 Javascript
jQuery获取样式中颜色值的方法
Jan 29 Javascript
javascript作用域问题实例分析
Jul 13 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
Mar 25 jQuery
解决js ajax同步请求造成浏览器假死的问题
Jan 18 Javascript
Angular2整合其他插件的方法
Jan 20 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
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
php购物车实现方法
2015/01/03 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
validator验证控件使用代码
2010/11/23 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
全面解析标签页的切换方式
2016/08/21 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
python实现文件快照加密保护的方法
2015/06/30 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
python pygame实现球球大作战
2019/11/25 Python
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
银行实习自我鉴定
2013/10/12 职场文书
班训口号大全
2014/06/18 职场文书
家长高考寄语
2015/02/27 职场文书
大学生求职自荐信
2015/03/24 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
幼儿园家长反馈意见
2015/06/03 职场文书
赞助商致辞
2015/07/30 职场文书
小学语文教师研修日志
2015/11/13 职场文书