i got react question. I am looping to render couple elements. onClick i want to change state for current element in loop. I manage to make it work with creating an object.
like this:
const [isOpen, setIsOpen] = useState({
preferences: true,
beanType: false,
quantity: false,
grindOption: false,
deliveries: false
});
function toggle(i) {
setIsOpen({...isOpen, [i]: !isOpen[i]});
}
return (
<form action="#" className="accordion stack space-9">
{props.data.map((curGroup, i) => (
<div className="accordion__group" id={curGroup.tab} key={curGroup.id}>
<header className="accordion__header" onClick={() => toggle(curGroup.tab)}>
<h2 className="title-2 text-neutral-4">{curGroup.title}</h2>
<svg className="accordion__arrow" data-open={isOpen[curGroup.tab]} width="24" height="24"
viewBox="0 0 19 11">
<use href="assets/sprites.svg#arrow"/>
</svg>
</header>
</div>
))}
</form>
);
Before this i had this code. Which changed state for all the rendered items and opened menu.
const [isOpen, setIsOpen] = useState(false);
function toggle(i) {
setIsOpen(!isOpen);
}
return (
<form action="#" className="accordion stack space-9">
{props.data.map((curGroup, i) => (
<div className="accordion__group" id={curGroup.tab} key={curGroup.id}>
<header className="accordion__header" onClick={toggle}>
<h2 className="title-2 text-neutral-4">{curGroup.title}</h2>
<svg className="accordion__arrow" data-open={isOpen} width="24" height="24"
viewBox="0 0 19 11">
<use href="assets/sprites.svg#arrow"/>
</svg>
</header>
</div>
))}
</form>
);
I feel like creating the object in state is more hard coded. Could someone help me how to make this more dynamic? Thank you.
CodePudding user response:
You'll have to do some hard-coding because there's one value that's different from the others - the preferences: true. As for the others, they can be left out of the object completely (as long as other code that uses the object can also understand undefined as well as false).
const [isOpen, setIsOpen] = useState({
preferences: true,
});
and change
data-open={isOpen[curGroup.tab]}
to
data-open={isOpen[curGroup.tab] ?? false}
