【问题标题】:How should I write Pagination component React JS?我应该如何编写 Pagination 组件 React JS?
【发布时间】:2021-07-02 14:18:20
【问题描述】:

我正在构建一个 web 应用程序,而且我也是 web-dev 的新手。我的后端响应为 json,其中包含分页,如下所示:

{
    "count": 16,
    "next": "http://localhost:8000/en/api/events/?page=3",
    "previous": "http://localhost:8000/en/api/events/",
    "results": [
        {
            "url": "",
            "id": ,
            "title": "",
            "creation_date": "",
            "description": "",
            "event_date": "",
            "link": ""
        },
        ...
    ],
    "total_pages": 4
}

我想为我的 EventList.jsx 组件添加分页:

import React, { useState, useEffect } from "react";
import { Link, NavLink } from "react-router-dom";
import "./Content.css";
import "./Pagination";

import { useLanguage } from "../../context/LanguageTranslator";
import { getLanguage } from "../../utils/getLanguage";
import Pagination from "./Pagination";

const initialState = {
  fullAPI: {
    count: 0,
    next: null,
    previous: null,
    results: [],
    total_pages: 0,
  },
};


const EventList = (props) => {
  const { language } = useLanguage();
  const currentLanguage = getLanguage(language);

  const [state, setState] = useState(initialState);
  const [loading, setLoading] = useState(false);

  useEffect(async () => {
    try {
      setLoading(true);
      const langUrl = currentLanguage.urlName;
      const page = props.match.params.page;
      const defaultUrl = `http://localhost:8000/${langUrl}/api/events/?page=${page}`;
      // * url which we will fetch
      let currentUrl;

      currentUrl = defaultUrl;

      const res = await fetch(currentUrl);
      const fullAPI = await res.json();

      setState((prevState) => ({ ...prevState, fullAPI }));
      setLoading(false);
    } catch (error) {
      setLoading(false);
      console.log(error);
    }
  }, []);

  const renderEvents = () => {
    const eventsList = state.fullAPI.results;

    return eventsList.map((item) => (
      <li key={item.id}>
        <p>
          {currentLanguage.title}:{item.title}
        </p>
        <p>
          <a href={item.link} className="aa">
            {currentLanguage.organizers}
          </a>
        </p>
        <Link to={`/events/id=${item.id}`} className="aa">
          {currentLanguage.linkToEvent}
        </Link>
      </li>
    ));
  };

  return (
    <main>
      <div>
        <ul>{renderEvents()}</ul>
        <Pagination
          totalPages={state.fullAPI.total_pages}
          next={state.fullAPI.next}
          previous={state.fullAPI.previous}
          currentPage={props.page}
        />
      </div>
    </main>
  );
};

export default EventList;

基本上现在我有了这个 Pagination.jsx:

import React, { useState, useEffect } from "react";
import { Link, NavLink, Redirect, useHistory } from "react-router-dom";
import "./Content.css";
import "./pagination.css";

const Pagination = (props) => {
  // * pagination

  const pages = [];
  for (let i = 1; i <= props.totalPages; ++i) {
    pages.push(i);
  }

  const handleClick = (number) => {
    return `/events/page=${number}`;
  };

  const renderPageNumbers = pages.map((number) => {
    return (
      <li
        key={number}
        id={number}
        onClick={() => {
          window.location.href = handleClick(number);
        }}
      >
        {number}
      </li>
    );
  });

  return (
    <div>
      {props.currentPage}
      <ul className="pageNumbers">{renderPageNumbers}</ul>
    </div>
  );
};

export default Pagination;

A 这样编码是因为我需要重新加载页面才能从服务器获取响应。所以现在我重新加载页面并且无法在分页组件内存储状态并且不能做这样的事情: [第一个] [上一个] 1 [2] ... 9 10 [下一个] [最后一个]

只有这个: 1 2 3 4 5 6 7 8 9 10

【问题讨论】:

    标签: javascript reactjs react-native pagination


    【解决方案1】:

    您不应在页面加载时从服务器获取响应。您最初可以在页面加载时获取,但从服务器加载应该是在一个单独的函数中,bothuseEffect 中调用,以及当用户想要转到下一页或上一页时。

    至于 [first] [prev] 类型的东西,您需要为此添加单独的元素。您当前正在为每个页面创建一个数组,而您可能只想为[first][prev][n-2][n+2][next][last] 提供单独的元素。我注意到您的回复有nextprevious 链接,但是,如果可能,您最好只发送当前页面,然后自己获取上一个或下一个页码(因为您已经知道要命中的端点) .

    无论如何,我已尽力而为,您似乎没有提出具体的问题,所以我试图回答您遇到的问题。

    【讨论】:

    • 我并没有真正得到 fetch 部分,如果可能的话,你能举个例子吗?一般来说,我想知道,我是否在重新加载页面时做正确的事情,或者是否有办法通过链接标签或任何其他方式(无需重新加载)浏览页面。因为现在我重写了它,删除了 onClick 方法,添加了 /events/page=${number}}\> 并且它更改了 url 但不呈现页面。
    • useEffect()(目前只是[])的数组中,输入页码使其成为[props.match.params.page]。您的useEffect() 将在每次该道具更改时重新执行,因此当页面更改时,您将再次获取数据。
    猜你喜欢
    • 2012-12-13
    • 1970-01-01
    • 2018-09-26
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2011-05-18
    相关资源
    最近更新 更多