antd的table進行列篩選時,更新dataSource,爲何table顯示暫無數據?

我想固然地認爲只要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

相關文章
相關標籤/搜索