el-table-column :filters 多条件后台筛选全部数据分页处理

本文介绍如何使用 Element UI 的表格组件实现分页时筛选全部数据而非仅当前页数据的功能。通过修改前端代码和后端处理逻辑,使得筛选操作能有效应用于整个数据集。涉及前端 Vue.js 和后端数据处理技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题描述

最终效果如下 将排序字段传入后台进行处理
在这里插入图片描述
需要通过筛选条件 不是排序 筛选全部后台数据而不是当前页数据
查找相关资料

2.解决过程

1.首先查找相关官方文档
在这里插入图片描述
发现是筛选当前页 这样只能前端进行分页及筛选才可以实现功能 如果数据量大的情况下很麻烦

2.查找相关博客资料
主要参考 参考资料2 博客链接 element ui table+分页 筛选全部数据-demo

3.最终代码

vue页面中放上部分关键代码 有些地方需要自行进行修改

<el-table border
                              ref="multipleTable"
                              :data="gameList"
                              :row-class-name="gameRowTableClass"
                              stripe
                              tooltip-effect="dark"
                              style="width: 100%" 
                               @filter-change="filterTagTable"
                              > 
                        <el-table-column
                                label="状态"
                                align="center"
                                :filters="[{ text: '已选', value: 1  }, { text: '未选', value: 0 }]"
                                :filter-multiple="false"
                                prop="id"
                                :column-key=" 'statusFlag' "
                                show-overflow-tooltip
                                >
                            <template slot-scope="scope" >
                                <el-tag type="success" v-if=" selectGameIds.has(scope.row.id)">已选中</el-tag>
                                <el-tag type="info" v-else>未选中</el-tag>
                            </template>
                        </el-table-column>
                        <el-table-column
                                prop="squareIcon"
                                label="大图标"
                                align="center"
                                :filters="[{ text: '', value: 1  }, { text: '', value: 0 }]"
                                :filter-multiple="false"
                                :column-key=" 'squareFlag' "
                                >
                            <template slot-scope="scope" >
                                <el-tag type="success" v-if="scope.row.squareIcon && scope.row.squareIcon !=''"></el-tag>
                                <el-tag type="info" v-else></el-tag>
                            </template>
                        </el-table-column>
                        <el-table-column
                                prop="bannerIcon"
                                :column-key=" 'bannerFlag' "
                                label="banner"
                                align="center"
                                :filters="[{ text: '', value: 1 }, { text: '', value: 0 }]"
                                :filter-multiple="false"
                                >
                            <template slot-scope="scope" >
                                <el-tag type="success" v-if="scope.row.bannerIcon && scope.row.bannerIcon !=''"></el-tag>
                                <el-tag type="info" v-else></el-tag>
                            </template>
                        </el-table-column>
                        <el-table-column
                                prop="microVideo"
                                :column-key=" 'videoFlag' "
                                label="视频"
                                align="center"
                                :filters="[{ text: '', value: 1 }, { text: '', value: 0 }]"
                                :filter-multiple="false"
                                >
                            <template slot-scope="scope" >
                                <el-tag type="success" v-if="scope.row.microVideo && scope.row.microVideo !=''"></el-tag>
                                <el-tag type="info" v-else></el-tag>
                            </template>
                        </el-table-column>
///////////////-----------------------------方法部分
filterTagTable(filters){
            // console.log("aaa:",filters,"2222")
            if(filters.statusFlag ){
              // console.log("设置statusFlag")
              //标志位
              this.queryGameSelector.statusFlag = filters.statusFlag[0]
              //设置渠道已选游戏id   这里把set展开成array
              this.queryGameSelector.selectAllGameIds =  [...this.selectGameIds];
            }else{
              // console.log("清空statusFlag")
              this.queryGameSelector.statusFlag = -1
              this.queryGameSelector.selectAllGameIds = [];
            }
            if(filters.squareFlag){
              //设置大图标标志位
              this.queryGameSelector.squareFlag = filters.squareFlag[0]
            }else{
              this.queryGameSelector.squareFlag =-1
            }
            if(filters.bannerFlag){
              //设置banner 标志位
              this.queryGameSelector.bannerFlag = filters.bannerFlag[0]
            }else{
              this.queryGameSelector.bannerFlag = -1
            }
            if(filters.videoFlag){
              //设置videoFlag
              this.queryGameSelector.videoFlag = filters.videoFlag[0]
            }else{
              this.queryGameSelector.videoFlag = -1
            }
            this.gameSelectorTemp() // 筛选所选项下的所有数据,需要调用后端接口
          },


//-------------------------------变量定义
                this.queryGameSelector={
                  "statusFlag" : -1 ,
                  "selectAllGameIds" : [],
                  "squareFlag" : -1,
                  "bannerFlag" : -1,
                  "videoFlag" : -1
                },

后台部分
接入进来参数可以通过sql语句进行查询
我这里业务比较麻烦就没采用这个
是通过stream流处理进行filter过滤的 这里就放一些代码 如果有好的建议欢迎交流

 List<GameSelectorSample> filterLists = gameSelectorSamples.stream().filter(gameSelectorSample -> {
            //判断筛选条件
            //1.判断是否为板块已选中游戏
            boolean judge1 = true;
            if (Objects.nonNull(search.getStatusFlag())) {
                if (!CollectionUtils.isEmpty(search.getSelectAllGameIds())) {
                    if (search.getStatusFlag() == 0) {
                        //这里 set非空 如果status=0 需要筛选不在set中的数据
                        judge1 = !search.getSelectAllGameIds().contains(gameSelectorSample.getId());
                    } else if (search.getStatusFlag() == 1) {
                        //如果status==1 需要筛选在set中的数据
                        judge1 = search.getSelectAllGameIds().contains(gameSelectorSample.getId());
                    }
                }
            }
            //2.判断是否有大图标 1是 0否
            boolean judge2 = true;
            if (Objects.nonNull(search.getSquareFlag())) {
                if (search.getSquareFlag() == 0) {
                    // 如果status=0 需要筛选 square为null的数据
                    judge2 = Strings.isBlank(gameSelectorSample.getSquareIcon());
                } else if (search.getSquareFlag() == 1) {
                    //如果status==1 需要筛选 square为非空的数据
                    judge2 = Strings.isNotBlank(gameSelectorSample.getSquareIcon());
                }
            }
            
            return judge1 && judge2 
        }).collect(Collectors.toList());

4.参考资料

官方相关文档
element ui table+分页 筛选全部数据-demo

<el-table ref="singleTable" :data="configs" border class="wraper-table" element-loading-text="Loading" fit highlight-current-row size="mini" style="margin: 0px 0 20px 0"> <el-table-column :label="$t('table.select')" width="50" align="center"> <template slot-scope="scope"> <el-radio v-model="radio" :label="scope.row.id" @change="chooseOne(scope.row)">{{ '' }}</el-radio> </template> </el-table-column> <el-table-column :label="$t('table.id')" align="center" width="50"> <template v-slot="scope"> {{ initTableIndex('page', scope.$index) }} </template> </el-table-column> <el-table-column :label="$t('i18nView.pdCode')" align="center" prop="pdCode"></el-table-column> <el-table-column :label="$t('i18nView.pdName')" align="center" prop="pdName"></el-table-column> <el-table-column :label="$t('customComponents.pdEdition')" align="center" prop="pdEdition"></el-table-column> <el-table-column :label="$t('pdtempPdInfoView.pdApplDate')" align="center" prop="pdApplDate" sortable></el-table-column> <el-table-column :label="$t('pdtempPdInfoView.updateTime')" align="center" prop="changeDate" sortable> <template v-slot="scope"><span v-if="scope.row.defType!=1">{{ scope.row.changeDate }}</span></template> </el-table-column> <el-table-column :label="$t('pdtempPdInfoView.definitionType')" align="center" prop="defType"> <template v-slot="scope">{{ scope.row.defType | filterDefType }}</template> </el-table-column> <el-table-column :filter-method="filterHandler" :filters="filterHandlerList1" :label="$t('pdtempPdInfoView.attributeDefinitionState')" align="center" prop="attrDefState"></el-table-column> <el-table-column :filter-method="filterHandler" :filters="filterHandlerList2" :label="$t('pdtempPdInfoView.structureDefinitionState')" align="center" prop="structDefState"></el-table-column> <el-table-column :filter-method="filterHandler" :filters="filterHandlerList3" :label="$t('pdtempPdInfoView.currentPriceDefinitionState')" align="center" prop="priceDefState"></el-table-column> <el-table-column :filter-method="filterHandler" :filters="filterHandlerList4" :label="$t('pdtempPdInfoView.superviseDefinitionState')" align="center" prop="superviseDefState"></el-table-column> </el-table> <!-- 分页 --> <cus-pagination ref="page" v-model="configs" :pageSize="10" :params="params" url="/pdtemp-pd-info/list"/>以上代码如何实现数据渲染
07-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值