- 函数组件和类组件均可以使用;
- 注意查看项目中antd的版本号;
import { Input, Button } from 'antd'; // v4
// import { Input, Button, Icon } from 'antd'; // v3
import { SearchOutlined } from '@ant-design/icons'; // v4
/**
* antd(4.x & 3.x) Table表格自定义筛选列
* @param {*} dataIndex 列字段
* @param {*} placeholder 自定义搜索框提示 String
* @returns {}
*
* 使用说明:
* Columns = [
* {
* title: 'Name',
dataIndex: 'name',
key: 'name',
* ...getColumnSearchProps('dataIndex')
* }
* ]
*/
export const getColumnSearchPropsV4 = (dataIndex, placeholder) => {
const state = {
searchText: '',
searchedColumn: '',
searchInput: null
};
const handleSearch = (selectedKeys, confirm, dataIndex) => {
confirm();
state.searchText = selectedKeys[0];
state.searchedColumn = dataIndex;
};
const handleReset = (clearFilters, confirm, selectedKeys) => {
clearFilters();
confirm();
state.searchText = selectedKeys[0];
state.searchedColumn = dataIndex;
};
return {
filterDropdown: ({
setSelectedKeys,
selectedKeys,
confirm,
clearFilters
}) => (
<div style={{ padding: 8 }}>
<Input
ref={(node) => {
state.searchInput = node;
}}
placeholder={placeholder || `Search ${dataIndex}`}
value={selectedKeys[0]}
onChange={(e) =>
setSelectedKeys(e.target.value ? [e.target.value] : [])
}
onPressEnter={() => handleSearch(selectedKeys, confirm, dataIndex)}
style={{ width: 188, marginBottom: 8, display: 'block' }}
/>
<Button
type="primary"
onClick={() => handleSearch(selectedKeys, confirm, dataIndex)}
icon={<SearchOutlined />}
size="small"
style={{ width: 90, marginRight: 8 }}
>
Search
</Button>
<Button
onClick={() => handleReset(clearFilters, confirm, selectedKeys)}
size="small"
style={{ width: 90 }}
>
Reset
</Button>
</div>
),
filterIcon: (filtered) => (
<SearchOutlined style={{ color: filtered ? '#1890ff' : undefined }} />
),
onFilter: (value, record) => {
return record[dataIndex]
.toString()
.toLowerCase()
.includes(value.toLowerCase());
},
onFilterDropdownVisibleChange: (visible) => {
if (visible) {
setTimeout(() => state.searchInput.select(), 100);
}
}
};
};
export const getColumnSearchPropsV3 = (dataIndex, placeholder) => {
const state = {
searchText: '',
searchedColumn: '',
searchInput: null
};
const handleSearch = (selectedKeys, confirm, dataIndex) => {
confirm();
state.searchText = selectedKeys[0];
state.searchedColumn = dataIndex;
};
const handleReset = (clearFilters) => {
clearFilters();
state.searchText = '';
};
return {
filterDropdown: ({
setSelectedKeys,
selectedKeys,
confirm,
clearFilters
}) => (
<div style={{ padding: 8 }}>
<Input
ref={(node) => {
state.searchInput = node;
}}
placeholder={placeholder || `Search ${dataIndex}`}
value={selectedKeys[0]}
onChange={(e) =>
setSelectedKeys(e.target.value ? [e.target.value] : [])
}
onPressEnter={() => handleSearch(selectedKeys, confirm, dataIndex)}
style={{ width: 188, marginBottom: 8, display: 'block' }}
/>
<Button
type="primary"
onClick={() => handleSearch(selectedKeys, confirm, dataIndex)}
icon="search"
size="small"
style={{ width: 90, marginRight: 8 }}
>
Search
</Button>
<Button
onClick={() => handleReset(clearFilters)}
size="small"
style={{ width: 90 }}
>
Reset
</Button>
</div>
),
filterIcon: (filtered) => (
<Icon type="search" style={{ color: filtered ? '#1890ff' : undefined }} />
),
onFilter: (value, record) =>
record[dataIndex].toString().toLowerCase().includes(value.toLowerCase()),
onFilterDropdownVisibleChange: (visible) => {
if (visible) {
setTimeout(() => state.searchInput.select(), 100);
}
}
};
};