一尘不染

为地图循环中的当前元素反应更改 useState 布尔值

javascript

我有反应的问题。我正在循环渲染几个元素。onClick 我想更改循环中当前元素的状态。我设法使它与创建对象一起工作。

像这样:

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>
);

在此之前我有这个代码。它改变了所有渲染项目和打开菜单的状态。

    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>
);

我觉得在状态下创建对象更加硬编码。有人可以帮助我如何使它更具活力吗?谢谢你。


阅读 78

收藏
2022-07-27

共1个答案

一尘不染

您必须进行一些硬编码,因为有一个值与其他值不同 - preferences: true. 至于其他的,可以完全从对象中排除(只要其他使用该对象的代码也能理解undefinedfalse

const [isOpen, setIsOpen] = useState({
    preferences: true,
});

和改变

data-open={isOpen[curGroup.tab]}

data-open={isOpen[curGroup.tab] ?? false}
2022-07-27