数据量庞大的分页穿梭框实现
博客地址:https://ainyi.com/63
昨天偶然看到评论区一位老哥的需求,一时兴起,就答应了当天写好源码写个博客
回来的晚,第二天才写好。。
写个分页的穿梭框,从而解决数据量庞大的问题
我之前写过一篇博客:关于 Element 组件的穿梭框的重构 介绍并实现的方法
但是第二个分页的 demo 没有,在上一家公司匆匆解决后,没有写入自己的 GitHub,有点可惜...
当时可是在上班,而且太忙了,不过既然答应了这位老哥写个 demo,就要做到,也是给自己一个挑战
进入正题
看实现效果图
既然之前博客谈过,这里就不仔细谈了,主要放主要的源码
问题
Element 官方组件目前(==18年==)明显对于多选==三级联动的穿梭框==没有解决方案,也对==数据量庞大的穿梭框==没有结局方案(各位看官可以试一下,放入几千条数据到穿梭框,卡到爆...),遂只能自己重写组件,完成业务需求
功能
- 实现分页
- 搜索,做成在所有数据里搜索,不是在当前分页的数据里搜索,这样就不用在每个分页都搜索一次了。搜索后的结果也会自动分页。(全部数据和仅作展示的数据存都是存放在不同变量)
- 全选只在当前页里的全选
- 穿梭框左右两个框的联动
关键点
- 每个框作为一个子组件(组件化思想)
- 分页关键判断临界点
- 搜索,监听 keyword 的变化,传递到父组件搜索,从全局数据搜索
- 把备选的数据当做已选的过滤数组,把已选的数据当做备选的过滤数组,在全局 data 进行过滤,最后再进行一次搜索(备选、已选)(考虑到是在搜索过后点击的)
- 中间的左右箭头(加入已选和移除已选)放在父组件控制数据流动
- 数据流动:子备选框 -> 父组件 -> 子已选框 (移除已选相反)
源码
- Districts.vue(包裹两个穿梭框的父组件)
export default {props: {data: {type: Array,},},data () {return {dataList: [], // 未选中(已过滤出已选)的数据selectList: [], // 已选中的数据,传递到子组件的数据dataListNoCheck: [], // 未选中的(或已搜索)传递到子组件的数据selectListCheck: [], // 已选中的(或已搜索)传递到子组件的数据checkData: [], // 已勾选的数据(待添加或删除数据)noSelectkeyword: '',haSelectkeyword: '',disablePre: true,disableNex: true,};},created () {this.getDistrict();},methods: {// 分页数据getDistrict () {this.dataList = this.data;this.dataListNoCheck = this.dataList;},searchWord (keyword, titleId) {// 过滤掉数据,保留搜索的数据if (titleId === 0) {this.noSelectkeyword = keyword;this.dataListNoCheck = this.dataList.filter(val => val.name.includes(keyword));} else {this.haSelectkeyword = keyword;this.selectListCheck = this.selectList.filter(val => val.name.includes(keyword));}let refsName = titleId === 0 ? 'noSelect' : 'hasSelect';// 延迟执行setTimeout(() => {this.$refs[refsName].getDistrict();}, 0);},// 检查左右按钮可用性checkDisable (data, id) {if (id === 0) {data.length > 0 ? (this.disableNex = false) : (this.disableNex = true);} else {data.length > 0 ? (this.disablePre = false) : (this.disablePre = true);}},// 选择checkSelect (val) {this.checkData = val;},// 关键:把未选择的数据当做已选择的过滤数组,把已选择的数据当做未选择的过滤数组,在全局data进行过滤,最后进行一次搜索// 添加至已选addData () {let dataFilter = [...this.selectList,...this.checkData,];this.dataList = this.data.filter(item1 => {return dataFilter.every(item2 => item2 !== item1);});this.selectList = this.data.filter(item1 => {return this.dataList.every(item2 => item2 !== item1);});// 搜索一次this.searchWord(this.noSelectkeyword, 0);this.searchWord(this.haSelectkeyword, 1);},// 从已选中删除deleteData () {let dataFilter = [...this.dataList,...this.checkData,];this.selectList = this.data.filter(item1 => {return dataFilter.every(item2 => item2 !== item1);});this.dataList = this.data.filter(item1 => {return this.selectList.every(item2 => item2 !== item1);});// 搜索一次this.searchWord(this.noSelectkeyword, 0);this.searchWord(this.haSelectkeyword, 1);},},components: {Transfer,},
};
</script>
- Transfer.vue(穿梭框子组件)
export default {props: {titleId: {type: Number,},districtList: { // 父组件传递的数据type: Array,},},data () {return {title: ['渠道', '已选中'],districtListMock: [], // 展示的数据 (搜索和分页会自动修改这个数组)checkedCities: [], // 已选择,数据格式:[id,id,id...]isIndeterminate: false,checkAll: false,searchWord: '',len: 0,total: 0,pageIndex: 0,disabledPre: true,disabledNex: false,};},created () {this.getDistrict();},watch: {// 搜索框的监听器searchWord (newWord) {this.$emit('search-word', newWord, this.titleId);},// districtListMock 和 checkAll 的监听器districtListMock () {// 当方框中无已选择的数据时,不能勾选checkBoxif (this.checkedCities.length === 0) {this.checkAll = false;this.isIndeterminate = false;}},checkedCities (newWord) {this.$emit('check-disable', newWord, this.titleId);},// 当列表中无数据时,不能勾选checkBoxcheckAll () {this.checkAll = this.districtListMock.length === 0 ? false : this.checkAll;},},methods: {// 分页数据getDistrict () {this.len = this.districtList.length;this.total = Math.ceil(this.len / 200);this.pageIndex = 0;this.pageData();},pageData () {this.checkedCities = [];if (this.total > 1 && this.pageIndex < (this.total - 1)) {this.pageIndex === 0 ? this.disabledPre = true : this.disabledPre = false;this.disabledNex = false;this.districtListMock = this.districtList.slice(this.pageIndex \\* 200, this.pageIndex \\* 200 + 200);} else {this.total > 1 ? this.disabledPre = false : this.disabledPre = true;this.disabledNex = true;this.districtListMock = this.districtList.slice(this.pageIndex \\* 200, this.len);}},// 上一页prev () {this.pageIndex > 0 && --this.pageIndex;this.pageData();},// 下一页next () {this.pageIndex <= (this.total - 1) && ++this.pageIndex;this.pageData();},// 单选handleCheckedChange (value) {let checkedCount = value.length;this.checkAll = checkedCount === this.districtListMock.length;this.isIndeterminate = checkedCount > 0 && checkedCount < this.districtListMock.length;// 子传父this.$emit('check-district', value);},// 全选handleCheckAllChange (val) {this.checkedCities = val ? this.districtListMock.map(val => val) : [];this.isIndeterminate = false;// 子传父this.$emit('check-district', this.checkedCities);},},
};
</script>
具体源码可前往 Github:https://github.com/Krryxa/my-transfer
欢迎 start
呼呼,双休好好休息了~~
博客地址:https://ainyi.com/63
转载于:https://www.cnblogs.com/ainyi/p/10125443.html
数据量庞大的分页穿梭框实现相关推荐
- 大数据量下 PageHelper 分页查询性能问题的解决办法
作者:岁月安然 blog.csdn.net/baidu_38083619/article/details/82463058 前因 项目一直使用的是PageHelper实现分页功能,项目前期数据量较少一 ...
- Mysql优化-大数据量下的分页策略
一.前言 通常,我们分页时怎么实现呢? 1 SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但是,数据量猛增以后呢? 1 SELECT * FROM t ...
- 大数据翻页_大数据量下的分页解决方法
最好的办法是利用sql语句进行分页,这样每次查询出的结果集中就只包含某页的数据内容.再sql语句无法实现分页的情况下,可以考虑对大的结果集通过游标定位方式来获取某页的数据. sql语句分页,不同的数据 ...
- mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。
转载地址:http://www.cnblogs.com/lpfuture/p/5772055.html 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: ...
- easyui分页查询为什么会有下拉框_6个针对MySQL大数据量分页查询优化的锦囊妙计...
作者:大神养成记转载来源:http://sina.lt/gauW 方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M ...
- MySQL大数据量分页查询方法及其优化
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:收藏了!7 个开源的 Spring Boot 前后端分离优质项目个人原创+1博客:点击前往,查看更多 链接:ht ...
- 千万级别数据查询优化_MySQL大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适 ...
- 大数据量分页查询方法(转)
本文旨在介绍一种对数据库中的大数据量表格进行分页查询的实现方法,该方法对应用服务器.数据库服务器.查询客户端的cpu和内存占用都较低,查询速度较快,是一个较为理想的分页查询实现方案. 1.问题的提出 ...
- mysql大数据量分页的一些做法
随着公司业务的增长,数据库的数据也呈指数级增长,拿订单表为例,之前公司的订单表每天只有几千个,一个月下来不超过十万.而现在每天的订单大概就是2w+,目前订单表的数据已经达到了700w.这带来了各种各样 ...
最新文章
- 那些总是写“烂代码”的同学,强烈推荐你使用这款IDEA插件!
- 一个「菜鸟」转行AI的成长心得!
- paddle深度学习框架中的FFT
- python 相对路径
- 不会出现这样的情况吧
- ReactJS入门之环境搭建以及编写HelloWorld程序
- OS X Mountain Lion上的多个Java版本
- 简单的11步在Laravel中实现测试驱动开发
- Java基础学习总结(111)——Java虚拟机JVM总结大全
- 推荐的PDF阅读器(可对pdf文章进行编辑操作的)
- 大数据可以考哪些证书?
- 解决:Docker Container exited with code 137
- 微信订阅号之1-注册
- 电脑桌面一计算机打不开怎么办,电脑桌面什么都打不开怎么办
- 用计算机算日期,200天纪念是在哪一天,几月几日?
- Navicat Premium 12的过期激活,问题解决的心路历程
- 【ADNI】对 nii 3D 数据进行裁剪(Matlab)待完善...
- 1018 锤子剪刀布python3无超时
- 田亮晒森碟与海豚亲吻照 父女开心超有爱
- torch.flatten()