繁体   English   中英

从 api 接收数据时遇到问题

[英]Having trouble receiving data from api

我是使用 REACT 的新手,我无法从我的 api 接收数据。 我正在使用邮递员来帮助我构建这个项目,所以我希望我能正确使用它。 该应用程序将显示我的表格和分页,但不会显示来自我选择的 api 的信息。 我在想我需要将我的 api 作为一个数组,但是我将如何将我的 api 变成一个数组以正确显示我的数据? 这是我的代码:

import axios from "axios";
import _ from "lodash"; //lookup lodash
import Table from "react-bootstrap/Table";

const pageSize = 10;
const Posts = () => {
  const [_posts, set_posts] = useState();
  const [paginatedPosts, setPaginatedPosts] = useState();
  const [currentPage, setCurrentPage] = useState(1);

  useEffect(() => {
    axios.get("https://swapi.dev/api/people/").then((res) => {
      console.log(res.data);
      set_posts(res.data);
      setPaginatedPosts(_(res.data).slice(0).take(pageSize).value());
    });
  }, []);

  const pageCount = _posts ? Math.ceil(_posts.length / pageSize) : 0;
  if (pageCount === 1) return null;
  const pages = _.range(1, pageCount + 1);

  function pagination(pageNo) {
    setCurrentPage(pageNo);
    const startIndex = (pageNo - 1) * pageSize;
    const paginatedPosts = _(_posts).slice(startIndex).take(pageSize).value();
    setPaginatedPosts(paginatedPosts);
  }

  return (
    <div>
      {!paginatedPosts ? (
        "No data found"
      ) : (
        <Table striped bordered hover className="project--table">
          <thead>
            <tr>
              <th>Name</th>
              <th>Birth Year</th>
              <th>Height</th>
              <th>Mass</th>
              <th>Species</th>
              <th>Home World</th>
            </tr>
          </thead>
          <tbody>
            {paginatedPosts.map((_post, index) => (
              <tr key={index}>
                <td>{_post.name}</td>
                <td>{_post.birth_year}</td>
                <td>{_post.height}</td>
                <td>{_post.mass}</td>
                <td>{_post.species}</td>
                <td>{_post.home_world}</td>
              </tr>
            ))}
          </tbody>
        </Table>
      )}
      <nav className="d-flex justify-content-center">
        <ul className="pagination">
          {pages.map((page) => (
            <li
              className={
                page === currentPage ? "page-item active" : "page-item"
              }
            >
              <p className="page-link" onClick={() => pagination(page)}>
                {page}
              </p>
            </li>
          ))}
        </ul>
      </nav>
    </div>
  );
};

export default Posts;


The api I am using is the starwarsapi

首先,您总是需要检查响应正文。 在您的情况下,获取列表将是 res.data.result ,并且它也具有其他属性,例如记录的总长度。 修复后,您将获得列表,但您的分页逻辑有错误。

一个建议是删除分页逻辑,逐步进行,这样您就可以更好地了解正在发生的事情。 例如,您处理页面大小的方式将始终为 1,因为您没有计算总数据长度,而是计算列表长度。 因此,您需要使用 response.data 对象的其他属性。

对分页可能有用的另一点是,您实际上并不需要在前端进行分页,api 已经有一个页面参数(每页 10 条记录,如您的示例)。 但是如果你想创建分页,你不需要 lodash 来做,搜索普通的 javascript 解决方案。

帖子位于 res.data 中的结果中,因此您需要将帖子设置为 res.data.results

useEffect(() => {
    axios.get("https://swapi.dev/api/people/").then((res) => {
      console.log(res.data);
      set_posts(res.data.result);

    });
  }, []);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM