Element-UI 实战系列:Table+Pagination 组件实现已选和全选功能
前言
现在开发的都是Vue
项目,所以也就接触到了Element-UI
库,在使用Table
+Pagination
组件的过程中,实现分页多选时,遇到了难题,比如在第一页勾选了Table
列表上的多条数据,然后切换到第二页,再切回第一页,就会发现勾选的状态消失了,我们需要的效果当然是,切回第一页时,Table
列表上的已勾选的状态还是存在的,本文就是将实现过程记录一下。
效果图
实现过程
这个需求,如果只是已选功能的话,其实很简单,只要把选择的用户,存放到一个新的数组里即可,代码如下所示:
selection-change
事件是Table
组件支持的返回已勾选用户的数组,那么直接使用this.selectData = value
,就可以获取得到当前已选用户的数据了,但是在分页切换后,并不能保留之前在该页勾选的状态,因为这个需求是通过分页加载实现的,其意思是,一开始这个Table
列表所展示的50
条用户数据不是一下子直接从数据库全部请求回来的,而是每次只请求10
条,分页切换之后,再请求回来10
条重新赋值到Table
列表上,这样tableData
的数据就是一直被清空并重新赋值,如以下代码所示:
这样就会有一个问题,如果在第一页什么都没勾选,那么切换到第二页的时候,是不会触发selection-change
时间的,但如果第一页有勾选了用户,那么切换至第二页,就会触发该事件,并且其值为空数组,因为selection-change
事件触发条件是,当选择项发生变化,为了解决这个问题,就想到了将每一页已选的用户分别存放到一个数组里,然后该数组又放到selectData
对应的下标位置,代码如下所示:
以上代码之所以需要判断value.length !== 0
是因为,为了防止切换时,将之前已经勾选的用户数据清空,但是这里会造成一个问题,那就是清空该页的操作,也是会出现val.length===0
的情况,所以这里还要想下怎么处理这个情况,怎么区分分页切换后已选用户数据为空,是页面数据初始化触发的,还是点击清空勾选框触发的?
然后,我就去看下Element-UI
上面Table
组件,看下有没有什么好的办法,然后还真被我找到了,我将@selection-change
改为@select
和@select-all
两个事件,完美解决遇到的这个难题,代码如下所示:
接下来,就是实现如果在分页切换后,还保留上一页已选的勾选状态,其实就是,在分页数据初始化的时候,判断下之前是否在该页,有过选择的用户,如果有的话,就通过this.$refs.multipleTable.toggleRowSelection(item, true)
设置其Checkbox
为勾选状态,代码如下所示:
至于全选功能,其实和已选功能一样,核心都在这行代码this.$refs.multipleTable.toggleRowSelection(item, true)
,代码如下所示:
写在最后
我其实也在怀疑写这个东西的意义何在,有时候会想,未免小题大做了,但是在当时确实给自己带来了很大的困扰,做我自己就好了,希望自己可以探索得更为深入,而不是浮于表面。
示例代码:https://github.com/BRAVE2HEART/infoq-vue-example
版权声明: 本文为 InfoQ 作者【brave heart】的原创文章。
原文链接:【http://xie.infoq.cn/article/5b14a9b54c40b8a7ee82c20ea】。文章转载请联系作者。
评论