docs: rewrite custom filter demo with filterDropdown function

This commit is contained in:
Wei Zhu 2018-07-02 18:39:49 +08:00
parent 1af4392ae9
commit 0f2fea2d78
2 changed files with 37 additions and 137 deletions

View File

@ -7,11 +7,11 @@ title:
## zh-CN ## zh-CN
通过 `filterDropdown`、`filterDropdownVisible` `filterDropdownVisibleChange` 定义自定义的列筛选功能,并实现一个搜索列的示例。 通过 `filterDropdown` 自定义的列筛选功能,并实现一个搜索列的示例。
## en-US ## en-US
Implement a customized column search example via `filterDropdown`, `filterDropdownVisible` and `filterDropdownVisibleChange`. Implement a customized column search example via `filterDropdown`.
````jsx ````jsx
import { Table, Input, Button, Icon } from 'antd'; import { Table, Input, Button, Icon } from 'antd';
@ -40,40 +40,17 @@ const data = [{
class App extends React.Component { class App extends React.Component {
state = { state = {
filterDropdownVisible: false,
data,
searchText: '', searchText: '',
filtered: false,
}; };
onInputChange = (e) => { handleSearch = (selectedKeys, confirm) => () => {
this.setState({ searchText: e.target.value }); confirm();
this.setState({ searchText: selectedKeys[0] });
} }
onSearch = () => { handleReset = clearFilters => () => {
const { searchText } = this.state; clearFilters();
const reg = new RegExp(searchText, 'gi'); this.setState({ searchText: '' });
this.setState({
filterDropdownVisible: false,
filtered: !!searchText,
data: data.map((record) => {
const match = record.name.match(reg);
if (!match) {
return null;
}
return {
...record,
name: (
<span>
{record.name.split(new RegExp(`(?<=${searchText})|(?=${searchText})`, 'i')).map((text, i) => (
text.toLowerCase() === searchText.toLowerCase()
? <span key={i} className="highlight">{text}</span> : text // eslint-disable-line
))}
</span>
),
};
}).filter(record => !!record),
});
} }
render() { render() {
@ -81,24 +58,38 @@ class App extends React.Component {
title: 'Name', title: 'Name',
dataIndex: 'name', dataIndex: 'name',
key: 'name', key: 'name',
filterDropdown: ( filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
<div className="custom-filter-dropdown"> <div className="custom-filter-dropdown">
<Input <Input
ref={ele => this.searchInput = ele} ref={ele => this.searchInput = ele}
placeholder="Search name" placeholder="Search name"
value={this.state.searchText} value={selectedKeys[0]}
onChange={this.onInputChange} onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
onPressEnter={this.onSearch} onPressEnter={this.handleSearch(selectedKeys, confirm)}
/> />
<Button type="primary" onClick={this.onSearch}>Search</Button> <Button type="primary" onClick={this.handleSearch(selectedKeys, confirm)}>Search</Button>
<Button onClick={this.handleReset(clearFilters)}>Reset</Button>
</div> </div>
), ),
filterIcon: <Icon type="smile-o" style={{ color: this.state.filtered ? '#108ee9' : '#aaa' }} />, filterIcon: filtered => <Icon type="smile-o" style={{ color: filtered ? '#108ee9' : '#aaa' }} />,
filterDropdownVisible: this.state.filterDropdownVisible, onFilter: (value, record) => record.name.toLowerCase().includes(value.toLowerCase()),
onFilterDropdownVisibleChange: (visible) => { onFilterDropdownVisibleChange: (visible) => {
this.setState({ if (visible) {
filterDropdownVisible: visible, setTimeout(() => {
}, () => this.searchInput && this.searchInput.focus()); this.searchInput.focus();
});
}
},
render: (text) => {
const { searchText } = this.state;
return (
<span>
{text.split(new RegExp(`(?<=${searchText})|(?=${searchText})`, 'i')).map((fragment, i) => (
fragment.toLowerCase() === searchText.toLowerCase()
? <span key={i} className="highlight">{fragment}</span> : fragment // eslint-disable-line
))}
</span>
);
}, },
}, { }, {
title: 'Age', title: 'Age',
@ -117,7 +108,7 @@ class App extends React.Component {
}], }],
onFilter: (value, record) => record.address.indexOf(value) === 0, onFilter: (value, record) => record.address.indexOf(value) === 0,
}]; }];
return <Table columns={columns} dataSource={this.state.data} />; return <Table columns={columns} dataSource={data} />;
} }
} }
@ -137,6 +128,10 @@ ReactDOM.render(<App />, mountNode);
margin-right: 8px; margin-right: 8px;
} }
.custom-filter-dropdown button {
margin-right: 8px;
}
.highlight { .highlight {
color: #f50; color: #f50;
} }

View File

@ -1,95 +0,0 @@
---
order: 27
title:
en-US: Override filter panel renderer
zh-CN: TODO
---
## zh-CN
TODO
## en-US
Override filter panel renderer, injecting `filterDropdown` prop
````jsx
import { Table, Icon, Divider } from 'antd';
const columns = [{
title: 'Name',
dataIndex: 'name',
key: 'name',
render: text => <a href="javascript:;">{text}</a>,
}, {
title: 'Age',
dataIndex: 'age',
key: 'age',
filterDropdown: ({ prefixCls, setSelectedKeys, selectedKeys, confirm, clearFilters }) => {
return (
<div className={`${prefixCls}-view`}>
<div>
<a href="javascript:;" onClick={() => setSelectedKeys([42])}>
{selectedKeys.indexOf(42) >= 0 && <Icon type="check" />} 42
</a>
</div>
<div>
<a href="javascript:;" onClick={() => setSelectedKeys([32])}>
{selectedKeys.indexOf(32) >= 0 && <Icon type="check" />} 32
</a>
</div>
<Divider type="horizontal" style={{ margin: '5px 0' }} />
<a href="javascript:;" onClick={() => confirm()}>Confirm</a>{' - '}
<a href="javascript:;" onClick={() => clearFilters()}>Reset</a>
</div>
);
},
onFilter: (value, record) => value === record.age,
}, {
title: 'Address',
dataIndex: 'address',
key: 'address',
}, {
title: 'Action',
key: 'action',
render: (text, record) => (
<span>
<a href="javascript:;">Action 一 {record.name}</a>
<Divider type="vertical" />
<a href="javascript:;">Delete</a>
<Divider type="vertical" />
<a href="javascript:;" className="ant-dropdown-link">
More actions <Icon type="down" />
</a>
</span>
),
}];
const data = [{
key: '1',
name: 'John Brown',
age: 32,
address: 'New York No. 1 Lake Park',
}, {
key: '2',
name: 'Jim Green',
age: 42,
address: 'London No. 1 Lake Park',
}, {
key: '3',
name: 'Joe Black',
age: 32,
address: 'Sidney No. 1 Lake Park',
}];
ReactDOM.render(<Table columns={columns} dataSource={data} />, mountNode);
````
````css
.ant-dropdown-custom-view {
padding: 8px;
border-radius: 6px;
background: #fff;
box-shadow: 0 1px 6px rgba(0, 0, 0, .2);
}
````