将多次获取 API 的数据传递到数组以在函数外部访问时出现问题

Having issues passing data of a multiple fetch API into an array to access outside the function

尝试从多个 API 获取数据并将其传递给数组。数据仅在函数内部获取和传递。使用 useState 设置数据,最后只有一个数据传递到数组中。也使用了 Promise.all 方法,但当数据设置为使用状态时仍然给出相同的结果和无限循环。

import React, { useEffect, useState } from 'react';

export default function GetFirebaseRFID() {

  const [rfidData, setRfidData] = useState([]);
  let arrayList = ['24637310', '1182372559', '2022916526'];
  var dataArray = [];

  useEffect(() => {
    arrayList.forEach((element) => {
      fetch(`https://localhost:44301/api/unit/rfid/${element}`)
      .then(res => res.json())
      .then(data => {
        dataArray.push(data);
        setRfidData(dataArray);
      })
    });
  }, [])



  return (
    <>
      {console.log(rfidData)}
      {rfidData.map(data=> {
      return (
      <tr>
        <td>{data.itemID}</td>
        <td>{data.price}</td>
        </tr>
        )
      }
      )}

      
    </>
  );
}

enter image description here

Code and consoleLog output

您只看到一个条目,因为在数组中,因为您正在改变 dataArray 并将其再次设置为不会触发组件重新呈现的状态。我宁愿将逻辑分成两个组件,而不是在一个组件中查询所有“rfid”,我会有一个 RFID 组件,它将 RFID 作为 prop 并在它的 useEffect 中查询 API 仅用于一个 RFID 它收到。

function RFID({ id }) {
const [data, setData] = useState('');

useEffect(() => {
    fetch(`https://localhost:44301/api/unit/rfid/${id}`)
      .then(res => res.json())
      .then(data => {
        setData(data);
      })
  }, [])
 
  return (
    <tr>
      <td>{data.itemID}</td>
      <td>{data.price}</td>
    </tr>
  );
}

export default function GetFirebaseRFID() {

  let arrayList = ['24637310', '1182372559', '2022916526'];

  return (
    <>
      {arrayList.map(id => <RFID id={id} />)}   
    </>
  );
}

你能试试这个吗:

function YourComponent() {
  const [data, setData] = useState([]);

  useEffect(() => {
    getDataHandler();
  }, []);

  const getDataHandler = async () => {
    const arrayList = ['24637310', '1182372559', '2022916526'];
    const finalData = [];

    for (const item of arrayList) {
      const response = await fetch(`URL_OF_YOUR_API_WITH_${item}`);
      const resData = await response.json();
      finalData.push(resData);
    }

    setData(finalData);
  };

  return (
    <table>
      <tbody>
        {data.map((item) => (
          <tr key={item.itemID}>
            <td>{item.itemID}</td>
            <td>{item.price}</td>
          </tr>
        ))}
      </tbody>
    </table>
  );
}