簡體   English   中英

如何通過 React 中的對象數組 .map()

[英]How to .map() through an array of objects in React

我正在嘗試映射一些看起來像這樣的數據:

[
{
  "id": "cambridgeshire",
  "name": "Cambridgeshire"
},
{
  "id": "bedfordshire",
  "name": "Bedfordshire"
}
]

並將其顯示為列表。

我收到 allAreas 的錯誤未定義。 我有一種感覺是因為我不熟悉 JSON 對象。

在檢查 allAreas 的狀態時,它顯示未定義。

這是我試過的代碼

const Directory = () => {
  const [allAreas, setAllAreas] = useState([]);

  useEffect(() => {
    fetchAllAreasData().then((data) => setAllAreas(data));
  }, []);
  return (
    <div className='directory'>
      <ul>
        {allAreas.map((area) => (
          <li key={area.id}>{area.name}</li>
        ))}
      </ul>
    </div>
  );
};

澄清這是一個對象數組

在映射之前確保 allArea 存在。

const Directory = () => {
  const [allAreas, setAllAreas] = useState([]);

  useEffect(() => {
    fetchAllAreasData().then((data) => setAllAreas(data));
  }, []);
  return (
    <div className='directory'>
      <ul>
        {allAreas && allAreas.map((area) => (
          <li key={area.id}>{area.name}</li>
        ))}
      </ul>
    </div>
  );
};

如果您的問題沒有解決,請改用 useReducer,因為 useState 中的一些反應問題與有時中的數組有關。像這樣:

function reducer(state = [], action) {
 return action;
}

const Directory = () => {
  const [allAreas, dispatch] = useReducer(reducer, []);

  useEffect(() => {
    fetchAllAreasData().then((data) => dispatch(data));
  }, []);
  return (
    <div className='directory'>
      <ul>
        {allAreas.length > 0 && allAreas.map((area) => (
          <li key={area.id}>{area.name}</li>
        ))}
      </ul>
    </div>
  );
}; 
const [allAreas, setAllAreas] = useState([]); // your defaulted state must be [] instead of {}

只需將函數的第一行更改為:

const [allAreas, setAllAreas] = useState([]);

這可能是問題,因為您的 map 函數在承諾解決之前被調用並且您獲得數據。

為避免這種情況,請在迭代之前檢查'allAreas'的長度。

還有分配給'allAreas'對象而不是數組的初始值。 將初始分配更改為數組。

const Directory = () => {
  const [allAreas, setAllAreas] = useState([]);

  useEffect(() => {
    fetchAllAreasData().then((data) => setAllAreas(data));
  }, []);
  return (
    <div className='directory'>
      <ul>
        {allAreas.lenght && allAreas.map((area) => (
          <li key={area.id}>{area.name}</li>
        ))}
      </ul>
    </div>
  );
};

嘗試,

 <ul>
     {allAreas && allAreas.map((area) => (
         <li key={area.id}>{area.name}</li>
     ))}
 </ul>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM