如何从 API 中解构对象?

用户6837170

我正在从 ( https://reqres.in/api/users )调用 API ,我们能否将此 API 分解为单个对象数组。这样我就可以自定义 API 中固定的每个页面。

This is Codepen link https://codepen.io/monukr14/pen/oOWpyq



Initial API Format

{
  "page": 1,
  "per_page": 3,
  "total": 12,
  "total_pages": 4,
  "data": [
    {
      "id": 1,
      "first_name": "George",
      "last_name": "Bluth",
      "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg"
    },
    {
      "id": 2,
      "first_name": "Janet",
      "last_name": "Weaver",
      "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/josephstein/128.jpg"
    },
    {
      "id": 3,
      "first_name": "Emma",
      "last_name": "Wong",
      "avatar": "https://s3.amazonaws.com/uifaces/faces/twitter/olegpogodaev/128.jpg"
    }
  ]
}
卡梅伦唐纳

在这里,您将不得不进行多个 API 调用,所有这些调用都基于之前的调用。这几乎是async await.

// default start at page #1
async function makeRequest(page = 1) {
    const url = `https://reqres.in/api/users?page=${page}`
    const response = await axios.get(url);

    const { total_pages: totalPages, data } = response.data;

    const isLastPage = totalPages <= page;
    if (isLastPage) {
        return data; // if last page, just return this data
    }

    const next = await makeRequest(page + 1); // make request for next page
    return [...next, ...data] // return both sets of data
}

这是一个处理请求的函数。如果要获取更多页面,它会递归调用 API。

然后我们可以在您的componentDidMount方法中很好地处理它

componentDidMount() {
  makeRequest()
    .then(repos => this.setState({ repos }))
    .catch(error => console.log(error));
}

=== 编辑 ===

再想一想,我想更新我以前的答案,因为它不可扩展。它在所有请求发出后显示所有用户 - 在 4 页时不明显,但在更多页时会出现问题。

async function makeRequest(page = 1) {
  const url = `https://reqres.in/api/users?page=${page}`;
  const response = await axios.get(url);

  const { total_pages: totalPages, data } = response.data;

  return { totalPages, repos: data };
}

class Repos extends React.Component {
  state = {
    repos: []
  };

  async componentDidMount() {
    this.loadPages();
  }

  async loadPages() {
    const totalPages = await this.loadPage(1); // make first request

    const nextPage = 2;
    for (let i = nextPage; i <= totalPages; i++) { // make every request separately
      this.loadPage(i);
    }
  }

  async loadPage(page = 1) {
    const { totalPages, repos } = await makeRequest(page);
    this.addRepos(repos);

    return totalPages;
  }

  addRepos(repos) {
    this.setState(prevState => ({
      repos: [...repos, ...prevState.repos] // add to array, not override
    }));
  }
....
}

我更新的代码分别发出每个请求并附加到状态(而不是覆盖它)。这意味着它可以独立发出请求并在每个请求完成后立即添加用户。

这确实意味着顺序不一定与 API 匹配,但这可以通过根据需要对状态进行排序来更改。

你可以在这里看到它在 CodePen 上的工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章