我想當然地認為只要dataSource改變,那么<Table>
組件就會重新渲染,
但是有一種特殊情況例外:
在onFilter()
中不寫篩選條件,在調用filterDropdown
進行列篩選的時候,通過handleSearch
改變/保存dataSource
的狀態,此時<Table>
重新渲染,但是拿的不是dataSource={xxx}
,而是拿的filterDropdown
中的onFilter()
中的dataSource
,而onFilter
中是沒有寫代碼的,所以返回暫無數據
。
PS:
解釋下我不在onFilter()
中寫代碼的原因,因為我已將dataSource保存到state中,所以需要setState
去更改dataSource
數據,但是onFilter()
方法是在componentDidUpdate()
周期調用的,所以setState
會報錯,所以我想到了在onClick中setState,但這樣console.log出來,dataSource更改了,但是table顯示暫無數據。
示例代碼:
handleSearch=()=>{
??this.setState({dataSource:dataSourceB})
}
getColumnSearchProps?=?(dataIndex)?=>?({
????filterDropdown:?({
??????setSelectedKeys,?selectedKeys,?confirm,?clearFilters,
????})?=>?(
??????<div>
????????<Input
??????????value={selectedKeys[0]}
??????????onChange={e?=>?setSelectedKeys(e.target.value???[e.target.value]?:?[])}
??????????onPressEnter={()?=>?this.handleSearch(selectedKeys,?confirm)}
????????/>
????????<Button
??????????onClick={()?=>?this.handleSearch(selectedKeys,?confirm)}
????????>
??????????Search
????????</Button>
??????</div>
????),
????//篩選條件,沒有寫代碼,所以沒有數據返回,所以是暫無數據
????onFilter:?(value,?record)?=>{??},
??})
render{
??return(
????<Table
??????column={?[{...this.getColumnSearchProps('name')}}
??????dataSource={dataSourceA}
????>
??)?
}
復制代碼
示例代碼地址:
ant.design/components/…
列篩選邏輯的流程圖如下:
onFilter()的源碼:
?getLocalData(state?:?TableState<T>?|?null,?filter:?boolean?=?true):?Array<T>?{
????const?currentState:?TableState<T>?=?state?||?this.state;
????const?{?dataSource?}?=?this.props;
????let?data?=?dataSource?||?[];
????//?優化本地排序
???//就是這行代碼,通過slice,另開內存來保存dataSource
????data?=?data.slice(0);
????const?sorterFn?=?this.getSorterFn(currentState);
????if?(sorterFn)?{
??????data?=?this.recursiveSort(data,?sorterFn);
????}
????//?篩選
????if?(filter?&&?currentState.filters)?{
??????Object.keys(currentState.filters).forEach(columnKey?=>?{
????????const?col?=?this.findColumn(columnKey)?as?any;
????????if?(!col)?{
??????????return;
????????}
????????const?values?=?currentState.filters[columnKey]?||?[];
????????if?(values.length?===?0)?{
??????????return;
????????}
????????const?onFilter?=?col.onFilter;
????????data?=?onFilter
????????????data.filter(record?=>?{
??????????????return?values.some(v?=>?onFilter(v,?record));
????????????})
??????????:?data;
??????});
????}
????return?data;
??}
復制代碼
onFilter()的源碼地址:
github.com/ant-design/…
(完)