在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 相关文章推荐
event.X和event.clientX的区别分析
Oct 06 Javascript
javascript检测页面是否缩放的小例子
May 16 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
Jun 09 Javascript
jquery模拟SELECT下拉框取值效果
Oct 23 Javascript
JavaScript判断变量是否为undefined的两种写法区别
Dec 04 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
Oct 09 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
Jul 27 Javascript
vue,angular,avalon这三种MVVM框架优缺点
Apr 27 Javascript
JS获取当前地理位置的方法
Oct 25 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
Nov 08 Javascript
vue请求服务器数据后绑定不上的解决方法
Oct 30 Javascript
vuex存值与取值的实例
Nov 06 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
Php+SqlServer实现分页显示
2006/10/09 PHP
php方法调用模式与函数调用模式简例
2011/09/20 PHP
php适配器模式介绍
2012/08/14 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
php开发工具有哪五款
2015/11/09 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
js取得url地址参数实例
2013/02/22 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
使用js正则控制input标签只允许输入的值
2013/07/29 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
vue router demo详解
2017/10/13 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
浅谈python import引入不同路径下的模块
2017/07/11 Python
Python 查看文件的读写权限方法
2018/01/23 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
用pyqt5 给按钮设置图标和css样式的方法
2019/06/24 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
Django之路由层的实现
2019/09/09 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
CSS3 简写animation
2012/05/10 HTML / CSS
演讲稿开场白台词
2014/08/25 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
Python自动化爬取天眼查数据的实现
2021/06/15 Python
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏