I am new to React and I am having a problem. How to iterate over an array in an array? When trying to iterate over an array using the map() method, an error occurs
my code:
import React, {useState, useEffect} from 'react'; import Header from '../modules/header/header'; import Footer from '../modules/footer/footer'; import './pages.scss'; function PageWorksItem({ match, location }) { const { params: { id } } = match; const [error, setError] = useState(null); const [isLoaded, setIsLoaded] = useState(false); const [works, setItems] = useState([]); useEffect(() => { let cleanupFunction = false; fetch(`http://localhost:3001/works/${id}`) .then(res => res.json()) .then( (result) => { console.log(result); setIsLoaded(true); if(!cleanupFunction) setItems(result); }, (error) => { setIsLoaded(true); setError(error); } ) return () => cleanupFunction = true; }, []) if (error) { return <div className="works error">Error: {error.message}</div>; } else if (!isLoaded) { return <div className="works loading">. . .</div>; } else { return ( <> <Header /> <div className="works item"> {works.tags.map(item => ( <li>{item}</li> ))} </div> <Footer /> </> ); } } export default PageWorksItem;
JSON fragment:
{ "works": [ { "id": 1, "name": "21 one line SPA images", "cat": "Illustrations", "tags": ["one", "two", "free"] } ] }
if you specify {works.tags} or with an index {works.tags[0]} – everything works, but if you iterate over the array, an error occurs.
Advertisement
Answer
You are using works.tag.map
. But the initialization value of works
is an empty array []:
const [works, setItems] = useState([]);
. So works.tag
is undefined
and this error occurred.
You can fix this issue by add optional chaining
like this:
{works.tags?.map((item, index)=> ( <li key={index}>{item}</li> ))}
Note: You need to add unique key
in child componet when using map