antd table动态表头_使用 antd@4 table 自定义筛选表头功能做一个联动搜索表头筛选...

本文介绍了如何使用 Antd@4 的 table 组件自定义筛选功能,实现表头联动筛选。首先模拟了大量数据,接着展示了自定义筛选组件的样式和逻辑,包括全选功能的实现。最后,通过一个实际例子展示了如何处理筛选条件的逻辑,以完成联动筛选。文章还提到了在项目中遇到的问题和解决方案,包括数据筛选是取交集还是并集的选择。
摘要由CSDN通过智能技术生成

前言: 上篇文章是使用 antd@4 table 自定义表头筛选完成一个表格动态列的功能,这次需要完成一个表头联动条件筛选功能。

一、开始前

开始之前先去 Antd 官网看下「自定义的列筛选功能」的代码和逻辑:

插一句:

目前我做的是 PC 后台管理系统,系统里面涉及到大量带条件筛选的表头,项目中「table 自定义列筛选功能」这个组件是另一个小伙伴封装的,封装的还可以,就是没用到 Antd 「自定义的列筛选功能」提供的 API ,导致后面有很多效果需要自己去手动实现,例如: 筛选图标点亮、搜索框输入查询条件不点击确认自动清空效果等,因为项目比较急,没办法我只能全手动加上,结果造成代码非常的臃肿🧼。

二、模拟大量数据

项目中的接口肯定是不能直接拿来做 demo 演示的,而且就算我拿来了,大家也连不了,都是内网😂,还是老老实实的模拟接口吧。

模拟数据使用的模块 json-server 和 mockjs ,详细使用参考我去年写的文章:学习使用 json-server 和 mockjs

看看我去年写的代码,想想过的真快,都一年整了,哎!那时候好连 ES6 都不是太会 😂😂😂,感觉进步好大,用写博客逼着自己成长,各位观众没事也来试试呗👍。

好了,看下本次模拟数据的逻辑代码和注释:

// 使用 Mock

const Mock = require('mockjs');

const pinyin = require("pinyin");

// 引入node内置的文件系统

const { writeFile } = require('fs');

// 使用Random这个api

const random = Mock.Random;

// 统计 national 、province、education、作为查询条件

let nationalArr = [], provinceArr = [], educationArr = [];

// 汉字转拼音

function han2pinyin(han) {

return [].concat(...pinyin(han, {

// 拼音不加音调

style: pinyin.STYLE_NORMAL

})).join("");

};

const tableData = [];

for (let i = 0;i < 100;i++) {

// 随机56个民族

const national = random.pick(["汉族","蒙古族","回族","藏族","维吾尔族","苗族","彝族","壮族","布依族","朝鲜族","满族","侗族","瑶族","白族","土家族","哈尼族","哈萨克族","傣族","黎族","僳僳族","佤族","畲族","高山族","拉祜族","水族","东乡族","纳西族","景颇族","柯尔克孜族","土族","达斡尔族","仫佬族","羌族","布朗族","撒拉族","毛南族","仡佬族","锡伯族","阿昌族","普米族","塔吉克族","怒族","乌孜别克族","俄罗斯族","鄂温克族","德昂族","保安族","裕固族","京族","塔塔尔族","独龙族","鄂伦春族","赫哲族","门巴族","珞巴族","基诺族"]);

!nationalArr.includes(national) && nationalArr.push(national);

// 随机省份

let province;

do {

province = random.province();

} while(province === "山西省");

!provinceArr.includes(province) && provinceArr.push(province);

// 随机出受教育程度

const education = random.pick(["初中","高中","大专","本科","研究生"]);

!educationArr.includes(education) && educationArr.push(education);

// 数据放入数组arr

tableData.push({

"id" : i,

province,

education,

national

});

};

nationalArr = nationalArr.map(national => ({ title: national, value: han2pinyin(national)}));

provinceArr = provinceArr.map(province => ({ title: province, value: han2pinyin(province)})); /* 注意哦:陕西省和山西省的拼音一样的 */

educationArr = educationArr.map(education => ({ title: education, value: han2pinyin(education)}));

const db = { tableData, nationalArr, provinceArr, educationArr };

// 文件写入

writeFile("./db.json",JSON.stringify(db),function(err){

if (err) {

console.log(`写入错误,错误为:${err}`);

return ;

};

console.log("一百条信息录入成功!");

});

我通过 npx json-server --watch db.json --port 3000 来启动接口,一共启用四个接口链接分别为🔗:

http://localhost:3000/tableData

http://localhost:3000/nationalArr

http://localhost:3000/provinceArr

http://localhost:3000/educationArr

浏览器打开即可看到数据。

为了证明俺没骗你,截图为证

三、table 用到的一些样式

写 CSS 也是挺费劲的,做人不能不厚道,样式也送给大家,注:是 less 文件。

/*多选框去掉三角和文字*/

.ant-select-tree {

padding-left: 12px !important;

span.ant-select-tree-switcher,

.ant-select-tree-indent {

display: none;

}

}

.table-filter-dropdown {

position: relative;

padding: 6px;

box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.15);

.tree-select {

width: 150px;

margin-right: 5px;

vertical-align: middle;

.ant-select-selector {

height: 26px;

.ant-select-selection-item {

display: none;

}

}

}

.ant-btn {

height: 26px;

width: 70px;

vertical-align: middle;

}

.common-remove-filter {

position: absolute;

right: 86px;

top: 50%;

transform: translateY(-50%);

cursor: pointer;

color: #C2C2C2;

}

.common-treeSelect-dropdown {

top: 32px !important;

left: -6px !important;

border-top: 1px solid #E8E8E8;

}

}

四、数据渲染到表格

开始写代码之前我们确保知道 filterDropdown 函数四个形参的作用,不会回到标题一去看 Antd 官网:

setSelectedKeys 设置值

selectedKeys 存储值

confirm ok 时触发,清除搜索框输入的值和关闭筛选模块

clearFilters cancel 时触发,清除搜索框输入的值和关闭筛选模块

前端表头筛选

前端控制的表头筛选

对应的源代码和注释:

import React from 'react';

import 'antd/dist/antd.css';

import { Table, Button, Space, TreeSelect } from 'antd';

import { FilterOutlined } from '@ant-design/icons';

import Axios from 'axios';

import "./filterItem.less";

const SHOW_PARENT = TreeSelect.SHOW_PARENT;

export default class App extends React.Component {

state = {

// table 的 dataSource

dataSource: [],

// 表头三个下拉列表

educationArr: [],

nationalArr: [],

provinceArr: []

};

// 请求数据

async componentDidMount() {

const { data: tableData } = await Axios.get("http://localhost:3000/tableData");

const { data: provinceArr } = await Axios.get("http://localhost:3000/provinceArr");

const { data: nationalArr } = await Axios.get("http://localhost:3000/nationalArr");

const { data: educationArr } = await Axios.get("http://localhost:3000/educationArr");

this.setState({

dataSource: tableData,

educationArr,

nationalArr,

provinceArr

});

}

// treeSelect 组件 => 使用 treeData 把 JSON 数据生成树结构。

itemSelection = (treeData, dataIndex, selectedKeys, setSelectedKeys) => {

// 这些配置去 https://ant.design/components/tree-select-cn/ 查看

const tProps = {

treeData,

value: selectedKeys,

defaultValue: [],

placeholder: `Select ${dataIndex}`,

autoClearSearchValue: false,

treeCheckable: true,

maxTagCount: 0,

treeNodeFilterProp: 'title',

treeDefaultExpandAll: true,

showCheckedStrategy: SHOW_PARENT,

getPopupContainer: (triggerNode) => triggerNode.parentNode,

size: 'small',

className: 'tree-select',

dropdownMatchSelectWidth: 217,

dropdownClassName: 'common-treeSelect-dropdown'

};

tProps.onChange = value => {

setSelectedKeys(value);

};

return ;

}

// 格式化数据为 treeSelect 组件所需要的格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值