从后端获取数据后,如何在 React 中循环渲染元素?

How to loop and render elements in React after we got the data from the backend?

如何循环遍历来自后端的数据并根据它渲染组件?

我试过这样的事情:

import React, { useEffect } from 'react';
import BuildingItem from './components/buildingItem';
import { Config } from './config/config';

export default function Buildings() {

  const buildings = [];

  useEffect(() => {
    fetch(Config.domain + 'kingdom/buildings', {
      headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }
    })
      .then(res => res.json())
      .then(data => {
        
        for(let i = 0; i < data.length; i++) {
          buildings.push(<BuildingItem type={data[i].type} level={data[i].level} />);
        }
      })
  })

  return (
    <div className='buildings'>
      <div className='buildings-container'>
        {buildings}
      </div>
    </div>
  );
}

返回时也尝试过类似的方法

<div className='buildings-container'>
        {buildings.map((item)=> (
              item
        )}
</div>

在这里使用状态,然后通过它进行映射。

而不是这个:

 .then(data => {
        
        for(let i = 0; i < data.length; i++) {
          buildings.push(<BuildingItem type={data[i].type} level={data[i].level} />);
        }
      })

使用React.useState,例如:const [data, setData] = useState()代替const buildings = [];

 .then(data => {
       // create state like this for example: const [data, setData] = useState() instead of const buildings = [];
      setData(data)
  })

然后在 jsx 中做这样的事情:

{
data.map((item, idx) => <BuildingItem type={item.type} level={item.level} />)
}

试着改变这样的事情。事情是将项目推到 const buildings = [] 没有效果。所以你需要使用useState hook

import React, { useEffect, useState } from 'react';
import BuildingItem from './components/buildingItem';
import { Config } from './config/config';

export default function Buildings() {

  const [buildings, setBuildings] = useState([]);

  useEffect(() => {
    fetch(Config.domain + 'kingdom/buildings', {
      headers: { 'Authorization': 'Bearer ' + localStorage.getItem('token') }
    })
      .then(res => res.json())
      .then(data => setBuildings(data))
  })

  return (
    <div className='buildings'>
      <div className='buildings-container'>
        {buildings.map((item)=> (
          <BuildingItem type={item.type} level={item.level} />
        )}
      </div>
    </div>
  );
}