I have the following deceleration:
const [open1, setOpen1] = useState(false);
and would like to generate this as many as I fetch records from the database (for every record fetched ) I need new [open, setopen]
here is my for loop used in my code.
<Container fluid={true} className="text-center"> <div className="questionrectangle " onClick={() => setOpen1(!open1)} name="step-one" aria-controls="example-collapse-text" aria-expanded={open1}> <p className="questiontext "> {post.QString}</p> </div> <Collapse in={open1} name="step-two"> <p className="questionanswer">{post.Answer}</p> </Collapse> </Container> ``` If you have any idea I would be appreciated
Advertisement
Answer
Create separate component to hold ‘open’ state. Something like this..
function QuestionAnswer({post}) { const [open1, setOpen1] = useState(true); return ( <> <div className="questionrectangle " onClick={() => setOpen1(!open1)} name="step-one" aria-controls="example-collapse-text" aria-expanded={open1} > <p className="questiontext "> {post.QString}</p> </div> {open1 && ( <div name="step-two"> <p className="questionanswer">{post.Answer}</p> </div> )} </> ); }
Now, from your main application fetch the data and create one component for each Post – like this
// Replace this with fetch request const data = [ { QString: "Question 1", Answer: "answer 1" }, { QString: "Question 2", Answer: "answer 2" }, { QString: "Question 3", Answer: "answer 3" } ]; return ( <Container fluid={true} className="text-center"> {data.map((post) => ( <QuestionAnswer post={post} /> ))} </Container> ); }
Now, each component will hold its own copy of ‘Open’ state and will be able to handle individual open and close state.
You can see complete sample