首页 > 解决方案 > 无法通过数组映射对象数组

问题描述

我正在尝试从 api 获取数据并将其推送到数组中,然后通过它进行映射并将其呈现在页面上,但是当我尝试通过数组进行映射时,我什么也没得到。这是我的代码:

    let dataUrlNoPage = `https://api.themoviedb.org/3/movie/top_rated?api_key=${process.env.REACT_APP_TMDB_KEY}&language=en-US&page=`;
    let top100Array = [];

    const fetchData = () => {
for (let i = 1; i <= 5; i++) {
  fetch(dataUrlNoPage + i)
    .then((res) => res.json())
    .then((data) => {
      console.log(data);
      if (!data.errors) {
        for (let i = 0; i < data.results.length; i++) {
          top100Array.push(data.results[i]);
        }
        return top100Array;
      } else {
        setResults([]);
        console.log('error');
      }
    });
}
};

 fetchData();

console.log(top100Array);

我可以在这里看到控制台中的 top100Array。

const listItems = top100Array.map((movie) => (
<li key={movie.id}>
  <TopListCard movie={movie} />
</li>
));

 return (
<div className="container">
  <div className="row">
    <div className="col s12 m6">
      <div className="add-content">
        <h1>Top 20</h1>

        <ul className="results">{listItems}</ul>
        {console.log(listItems)}
      </div>
    </div>
  </div>
</div>
);
};

但我在这里得到空白页。谢谢您的帮助。

标签: javascriptreactjs

解决方案


而不是改变top100Array(然后.then由于某种原因从 中返回),您应该使用与异步结果一起设置的状态,以便强制重新渲染。用于Promise.all等待每次提取完成。

const [results, setResults] = useState();
const getData = i => fetch(dataUrlNoPage + i)
  .then((res) => res.json())
  .then((data) => {
    if (data.errors) {
      console.log(data.errors);
      throw new Error(data.errors);
    }
    return data.results;
// Retrieve results only once, on mount:
useEffect(() => {
  Promise.all(
    Array.from({ length: 5 }, (_, i) => getData(i + 1))
  )
    .then((allResults) => {
      setResults(allResults.flat());
    })
    .catch(handleErrors);
}, []);

然后渲染它:

<ul className="results">{results ? listItems(results) : null}</ul>

替换为JSON.stringify但是您想将结果数组转换为 JSX 元素。(也许你想要results.map(result => <span>result.title</span>),或类似的东西)


推荐阅读