【问题标题】:How to properly develop pagination on React?如何在 React 上正确开发分页?
【发布时间】:2020-01-26 06:49:24
【问题描述】:

我正在尝试实现分页,但出现错误。

分页最大大小设置为每页 10 项。

我有一个包含 17 多个项目的数组,当组件安装时,它会正确加载前 10 个项目,如果我转到下一页它也会正确加载下一个项目,但是当我回到上一页时,它加载 12 个项目。就像,每次我返回/下一页时,它都会多加载 2 个项目。

这就是我所拥有的:

const PAGINATION_PAGE_SIZE_DEFAULT = 10;

class ApaTable extends Component {
  constructor(props) {
    super(props);
    this.state = {
      headers: this.props.headers,
      data: this.props.data,
      page: 1,
      pageSize: PAGINATION_PAGE_SIZE_DEFAULT
    };
  }

  componentWillReceiveProps(nextProps) {
    const { data, headers } = nextProps;

    this.setState({ data: data.slice(0, this.state.pageSize), headers });
  }


  onPaginationChange = e => {
    let pageNumber = e.page;
    let pageSize = e.pageSize;
    let start = (pageNumber - 1) * pageSize;
    let end = pageNumber * pageSize;

    this.setState({
      data: this.props.data.slice(start, end),
      page: pageNumber,
      pageSize
   });
  }

  render() {
    const { data, headers } = this.state;

    console.log({ STATE_DATA: data });

    return (
     <>
        <DataTable
          rows={data}
          headers={headers}
          render={({ rows, headers, getRowProps, getTableProps }) => (...)} >...</DataTable>
        <PaginationV2
          totalItems={data.length}
          pageSize={PAGINATION_PAGE_SIZE_DEFAULT}
          pageSizes={[10, 20, 30]}
          onChange={this.onPaginationChange}
        />
     <>

    )
  }

}

这是我正在使用的组件:http://react.carbondesignsystem.com/?path=/story/pagination--pagination

所以我猜这是 slice 方法中的一些东西不能正常工作或者可能是状态。

在渲染方法中,我有这个console.log({ STATE_DATA: data });,它会在我每次更改页面时显示项目的数量,但是如果我来回做我提到的,表格会越来越多。

我可能会错过什么?

这是我正在使用的数据表组件 -> http://react.carbondesignsystem.com/?path=/story/datatable--default

和分页 -> http://react.carbondesignsystem.com/?path=/story/pagination--pagination

【问题讨论】:

    标签: javascript reactjs ecmascript-6


    【解决方案1】:

    像这样更改您的代码,不要直接更改数据,否则您将丢失所有其他分页数据,请单独保留tableData

    const PAGINATION_PAGE_SIZE_DEFAULT = 10;
    
    class ApaTable extends Component {
      constructor(props) {
        super(props);
        this.state = {
          headers: this.props.headers,
          data: this.props.data,
          tableData: this.props.data.slice(0, PAGINATION_PAGE_SIZE_DEFAULT),
          page: 1,
          pageSize: PAGINATION_PAGE_SIZE_DEFAULT
        };
      }
    
      componentWillReceiveProps(nextProps) {
        const { data, headers } = nextProps;
    
        this.setState({ tableData: data.slice(0, this.state.pageSize), data, headers });
      }
    
    
      onPaginationChange = e => {
        let pageNumber = e.page;
        let pageSize = e.pageSize;
        let start = (pageNumber - 1) * pageSize;
        let end = pageNumber * pageSize;
    
        this.setState({
          tableData: this.props.data.slice(start, end),
          page: pageNumber,
          pageSize
       });
      }
    
      render() {
        const { tableData, headers } = this.state;
    
        console.log({ STATE_DATA: tableData });
    
        return (
         <>
            <DataTable
              rows={tableDate}
              headers={headers}
              render={({ rows, headers, getRowProps, getTableProps }) => (...)} >...</DataTable>
            <PaginationV2
              totalItems={data.length}
              pageSize={PAGINATION_PAGE_SIZE_DEFAULT}
              pageSizes={[10, 20, 30]}
              onChange={this.onPaginationChange}
            />
         <>
    
        )
      }
    
    }
    

    【讨论】:

    • 每次我来回移动时,它都会继续加载另外 2 个项目。
    • 能否请您检查每个页面更改中的tableData
    • 是的。这很奇怪,因为它改变得很好。我可以看到tableData 持有 7 个项目,但表格呈现 9。第一次进入第二页时它只呈现 7 个项目,但第二次进入第二页时,它呈现 9 个项目。
    • 这不可能发生,你能检查一下DataTable指的是tableData吗?
    • 是的,我知道这不可能发生。它应该是组件的错误。
    猜你喜欢
    • 2019-10-31
    • 2010-10-08
    • 2018-08-24
    • 1970-01-01
    • 2017-12-04
    • 2020-11-02
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多