如何使用ReactJS以两种方式对表中的列进行排序

时间:2017-06-07 03:22:21

标签: javascript reactjs columnsorting

我正在ReactJS中构建一个简单的应用程序,它通过调用某个API来使用JSON数组。然后我在表中填充数组的结果。我现在想让表的列可以排序。我理想的是要进行升序和降序排序。一旦我按升序排序时点击标题,它应该按降序排序,反之亦然。这是我的代码。

class ParentComponent extends Component {
constructor(props) {
 super(props);
 this.state = { data: [] };
}

componentDidMount() {
  fetch("http://hostname:xxxx/yyyy/zzzz")
  .then(function(response) {
    return response.json();
  })
  .then(items => this.setState({ data: items }));
 }

render() {
var newdata = this.state.data;

return (
  <table className="m-table">
    <thead>
      <tr>
        <th>AccountName</th>
        <th>ContractValue</th>
      </tr>
    </thead>
    <tbody>
      {newdata.map(function(account, index) {
        return (
          <tr key={index} data-item={account}>
            <td data-title="Account">{account.accountname}</td>
            <td data-title="Value">{account.negotiatedcontractvalue}</td>
          </tr>
        );
      })}
    </tbody>
  </table>
  );
 }
}

export default ParentComponent;

1 个答案:

答案 0 :(得分:10)

您可以使用sortcolumn属性向您的州添加direction媒体资源:

state = {
  data: [],
  sort: {
    column: null,
    direction: desc,
  },
};

当然你也应该有一个像这样的排序处理程序:

onSort = (column) => (e) => {
  const direction = this.state.sort.column ? (this.state.sort.direction === 'asc' ? 'desc' : 'asc') : 'desc';
  const sortedData = this.state.data.sort((a, b) => {
    if (column === 'accountName') {
      const nameA = a.accountName.toUpperCase(); // ignore upper and lowercase
      const nameB = b.accountName.toUpperCase(); // ignore upper and lowercase
      if (nameA < nameB) {
        return -1;
      }
      if (nameA > nameB) {
        return 1;
      }

      // names must be equal
      return 0;
    } else {
      return a.contractValue - b.contractValue;
    }
  });

  if (direction === 'desc') {
    sortedData.reverse();
  }

  this.setState({
    data: sortedData,
    sort: {
      column,
      direction,
    }
  });
};

我从MDN获得了排序。

这是一支示例笔:https://codepen.io/anon/pen/xrGJKv