我想固然地認爲只要dataSource改變,那麼<Table>
組件就會從新渲染,
可是有一種特殊狀況例外:
在onFilter()
中不寫篩選條件,在調用filterDropdown
進行列篩選的時候,經過handleSearch
改變/保存dataSource
的狀態,此時<Table>
從新渲染,可是拿的不是dataSource={xxx}
,而是拿的filterDropdown
中的onFilter()
中的dataSource
,而onFilter
中是沒有寫代碼的,因此返回暫無數據
。git
PS:
解釋下我不在onFilter()
中寫代碼的緣由,由於我已將dataSource保存到state中,因此須要setState
去更改dataSource
數據,可是onFilter()
方法是在componentDidUpdate()
週期調用的,因此setState
會報錯,因此我想到了在onClick中setState,但這樣console.log出來,dataSource更改了,可是table顯示暫無數據。github
示例代碼:優化
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} > ) }
示例代碼地址:
https://ant.design/components/table-cn/#components-table-demo-custom-filter-panelthis
列篩選邏輯的流程圖以下:spa
onFilter()的源碼:code
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()的源碼地址:
https://github.com/ant-design/ant-design/blob/d922c377cba03bef39ddb7d271fce3f67c353be9/components/table/Table.tsxcomponent
(完)blog