日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

antd的table进行列筛选时,更新dataSource,为什么table显示暂无数据?

發(fā)布時(shí)間:2023/12/9 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 antd的table进行列筛选时,更新dataSource,为什么table显示暂无数据? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我想當(dāng)然地認(rèn)為只要dataSource改變,那么<Table>組件就會(huì)重新渲染,
但是有一種特殊情況例外:
在onFilter()中不寫(xiě)篩選條件,在調(diào)用filterDropdown進(jìn)行列篩選的時(shí)候,通過(guò)handleSearch改變/保存dataSource的狀態(tài),此時(shí)<Table>重新渲染,但是拿的不是dataSource={xxx},而是拿的filterDropdown中的onFilter()中的dataSource,而onFilter中是沒(méi)有寫(xiě)代碼的,所以返回暫無(wú)數(shù)據(jù)。

PS:
解釋下我不在onFilter()中寫(xiě)代碼的原因,因?yàn)槲乙褜ataSource保存到state中,所以需要setState去更改dataSource數(shù)據(jù),但是onFilter()方法是在componentDidUpdate()周期調(diào)用的,所以setState會(huì)報(bào)錯(cuò),所以我想到了在onClick中setState,但這樣console.log出來(lái),dataSource更改了,但是table顯示暫無(wú)數(shù)據(jù)。

示例代碼:

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>
????),
????//篩選條件,沒(méi)有寫(xiě)代碼,所以沒(méi)有數(shù)據(jù)返回,所以是暫無(wú)數(shù)據(jù)
????onFilter:?(value,?record)?=>{??},
??})

render{
??return(
????<Table
??????column={?[{...this.getColumnSearchProps('name')}}
??????dataSource={dataSourceA}
????>
??)?

}
復(fù)制代碼

示例代碼地址:
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?||?[];
????//?優(yōu)化本地排序
???//就是這行代碼,通過(guò)slice,另開(kāi)內(nèi)存來(lái)保存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;
??}
復(fù)制代碼

onFilter()的源碼地址:
github.com/ant-design/…


(完)

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的antd的table进行列筛选时,更新dataSource,为什么table显示暂无数据?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。