antd的table自定義排序思路

const total = processedDataWithoutZero.rows.map(a => a.value).reduce((a, b) => a + b, 0);
一句話就可以將數(shù)組里面的總value獲取到

antd的table自定義排序思路:

  1. columns里面給需要排序的增加一個sortType,代表是按照string還是number排序
  2. 需要排序的column增加一個onHeaderCell方法,傳一個row
  3. 將需要排序的column中的title改成一個函數(shù),接收icon參數(shù)generateTitle(icon),原因是要在title后面增加一個icon,顯示是否已經(jīng)排序
function generateTitle(name, icon) {
  return (
    <span>
      <FormattedMessage id={name} /> {icon && <Icon type={icon} />}
    </span>
  );
}
processColumns() {
    const { sortBy, sortType } = this.state;
    const columns = [{
      title: generateTitle('assets_table_name', sortBy === 'name' ? (sortType === 'asc' ? 'down' : 'up') : 'minus'),
      dataIndex: 'name',
      key: 'name',
      className: 'assets-sort',
      sortType: 'string',
      onHeaderCell: row => this.handleClickHeader(row),
    }, {
      title: generateTitle('assets_table_balance', sortBy === 'balance' ? (sortType === 'asc' ? 'down' : 'up') : 'minus'),
      dataIndex: 'balance',
      key: 'balance',
      className: 'assets-sort',
      sortType: 'number',
      onHeaderCell: row => this.handleClickHeader(row),
      render: text => <tt>{text}</tt>,
    }, {
      title: generateTitle('assets_table_balance_lock', sortBy === 'locked' ? (sortType === 'asc' ? 'down' : 'up') : 'minus'),
      dataIndex: 'locked',
      key: 'locked',
      className: 'assets-sort',
      sortType: 'number',
      onHeaderCell: row => this.handleClickHeader(row),
      render: text => <tt>{text}</tt>,
    }, {
      title: generateTitle('assets_table_balance_amount', sortBy === 'amount' ? (sortType === 'asc' ? 'down' : 'up') : 'minus'),
      dataIndex: 'amount',
      key: 'amount',
      className: 'assets-sort',
      sortType: 'number',
      onHeaderCell: row => this.handleClickHeader(row),
      render: text => <tt>{text}</tt>,
    }, {
      title: generateTitle('assets_table_balance_value', sortBy === 'value' ? (sortType === 'asc' ? 'down' : 'up') : 'minus'),
      dataIndex: 'value',
      key: 'value',
      className: 'assets-sort',
      sortType: 'number',
      onHeaderCell: row => this.handleClickHeader(row),
      render: text => <tt>{parseFloat(text).toFixed(2)}</tt>,
    }, {
      className: 'tb-opt',
      title: generateTitle('assets_table_balance_opt', ''),
      key: 'opt',
      width: 200,
      render: (t, r) => this.getTableOpt(t, r),
    }];
    return columns;
  }
  1. column改造完成之后,改造dataSource
processData(data, columns) {
    const { sortBy, sortType } = this.state;
    if (!sortBy) return data;
    const columnSortType = columns.filter(d => d.dataIndex === sortBy)[0].sortType;
    let ret = [...data];
    if (columnSortType === 'string') {
      if (sortType === 'asc') {
        ret = ret.sort((a, b) => a[sortBy] > b[sortBy] ? 1 : -1);
      } else {
        ret = ret.sort((a, b) => a[sortBy] > b[sortBy] ? -1 : 1);
      }
    } else {
      if (sortType === 'asc') {
        ret = ret.sort((a, b) => parseFloat(a[sortBy]) > parseFloat(b[sortBy]) ? 1 : -1);
      } else {
        ret = ret.sort((a, b) => parseFloat(a[sortBy]) > parseFloat(b[sortBy]) ? -1 : 1);
      }
    }
    return ret;
  }
  1. 最后是onHeaderCell的方法實現(xiàn),其實只需要根據(jù)sortType,sortBy一級column里面的row來改變排序
handleClickHeader(row) {
    const originSortBy = this.state.sortBy;
    const originSortType = this.state.sortType;
    return {
      onClick: () => {
        let sortBy;
        let sortType = 'asc';
        const dataIndex = row.dataIndex;
        if (!originSortBy) {
          // 若沒排序,則正序
          sortBy = dataIndex;
        } else if (originSortBy === dataIndex) {
          // 若相等,則變換
          if (originSortType === 'asc') {
            sortBy = originSortBy;
            sortType = 'desc';
          } else if (originSortType === 'desc') {
            sortType = 'asc';
          }
        } else {
          // 若不相等
          sortBy = dataIndex;
        }
        this.setState({
          sortBy,
          sortType,
        });
      },
    };
  }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容