【问题标题】:Pagination with React.js使用 React.js 进行分页
【发布时间】:2016-11-20 05:25:56
【问题描述】:

现在我被 React 的分页实现所困。我有来自 JSON 的所有必要数据,但是我没有得到任何结果。 这是我使用的代码: 首先,我从服务器获取数据:

constructor() {
    super();
    this.state = {items: {}, totalPages: [], nextPage: []};
}
componentDidMount() {
    let url = 'http://localhost:8000/items?json=true';
    request.get(url).then((response) => {
        this.setState({
            items: response.body.items.data,
            totalPages: response.body.items.last_page,
            nextPage: response.body.items.next_page_url
        });
    });
}

因此我得到了一个简单的 JSON 文件:

{
  "items": {
    "total": 26025,
    "per_page": 16,
    "current_page": 1,
    "last_page": 1627,
    "next_page_url": "http://localhost:8000/items?page=2",
    "prev_page_url": null,
    "from": 1,
    "to": 16,
    "data": [
      {
        "id": 1,
        ...
      },
      {
        "id": 2,
        ...
      },
      ...
    ]
 }
}

我在render 方法中成功显示items 数据,如下所示:

let items = _.map(this.state.items, (item) => {
        return (
                <div key={item.id}>
                        <div className="content">
                            <span>
                                {item.type}
                            </span>
                            ...
                        </div>
                </div>
        )
    });

然后return 就像这样:

return (
        <div>
           {items}
        </div>
        <div>
           <a href={this.state.nextPage}>Next</a>
        </div>
)

我可以看到在我按下Next 按钮到page2 后URL 发生了变化,但是有两个问题:当我单击Next 时,我想根据JSON 文件更改items 组件(即第一页包含第一组 16 个元素,第二页包含第二组)但没有变化,当我再次单击 Next 按钮但在第二页上(根据 URL)它没有让我进入第三页等等. 我知道我需要以某种方式将这些状态绑定到page2 URL 显示第二页上描述的内容,我浏览了教程,但如果我使用React 15.2.1,它们似乎已经过时了。 我将不胜感激任何可以帮助我解决问题的帮助或想法!

【问题讨论】:

    标签: json reactjs pagination


    【解决方案1】:

    将点击处理程序添加到您的链接元素并将 url 作为参数传递。在处理函数中发出 ajax 请求并使用 setState 更新状态(类似于你在 componentDidMount 上所做的)。

    constructor() {
        super();
        this.state = {
          items: [],
          totalPages: '',
          nextPage: ''
        };
        this._loadData = this._loadData.bind(this);
      }
      componentDidMount() {
        const url = 'http://localhost:8000/items?json=true';
        this._loadData(url);
    
      }
      _loadData(url) {
        request.get(url).then((response) => {
          this.setState({
            items: response.body.items.data,
            totalPages: response.body.items.last_page,
            nextPage: response.body.items.next_page_url
          });
        });
      }
      render() {
        let items = _.map(this.state.items, (item) => {
        return (
                <div key={item.id}>
                        <div className="content">
                            <span>
                                {item.type}
                            </span>
                            ...
                        </div>
                </div>
        )
    });
        return (
            <div>
               {items}
            </div>
            <div>
               <a href="#0" onClick={this._loadData(this.state.nextPage)}>Next</a>
            </div>
    )
      }
    

    【讨论】:

    • 嗨,Galeel,感谢您的回复!不幸的是,在我链接到下一页后它不起作用,给我一个控制台错误“无法读取 null 的属性'项目'”。似乎链接将我带到下一页,但项目的状态没有改变,请求输出显示 json 文档中的数据为空
    • 当您在地址栏中点击localhost:8000/items?page=2 时得到什么响应。?您收到的 JSON 响应是否与您在上面发布的类似?
    • 首先感谢您抽出宝贵的时间,非常感谢!我用 Postman 测试响应,这就是我发现的。在 JSON 文档中,我将 next_page_url 设为“?page=2”,但您可能看到我的第一个请求是使用“?json=true”参数来加载数据。导航到 "?page=2" 什么也没给我,但是当我导航到 "?page=2?json=true" 时,我得到了我想要的。我联系了我的后端开发人员进行更改,但我只是好奇是否可以在设置状态时将“?json=true”添加到 nextPage?
    • 是的,您可以使用“+”运算符进行正常的字符串连接。所以在你的情况下,在 setState 做这样的事情:response.body.items.next_page_url + '?json=true'
    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 2014-09-01
    • 2017-08-16
    • 2013-04-14
    • 2015-05-15
    • 2010-09-19
    • 2018-08-08
    • 2011-01-04
    相关资源
    最近更新 更多