单击一个项目时隐藏其他项目而无需在反应手风琴中定义任何 class

Hide other item when one is clicked without define any class in react accordion

我实现了手风琴,但现在我想一次只显示一个特定的项目。我知道这个平台上有很多关于同一个问题的答案,但我找不到任何合适的解决方案。实际上,我不想在活动项目中添加任何 class,也不想在 CSS 中添加任何内容。使用纯 JavaScript,我该如何实现? 这是我的代码:

   const PerFAQ = ({ ques, ans }) => {
    const [isShown, setIsShown] = useState(false)
    return (
        <>
            <li>
                <a onClick={() => setIsShown(!isShown)}>{ques}
                    {
                        !isShown ? <BsChevronDown /> : <BsChevronUp />
                    }
                </a>
                {
                    isShown && <ul>
                        <li>
                            {ans}
                        </li>
                    </ul>
                }
            </li>
        </>
    )
}

愿意在需要时分享更多代码。

您可以通过提升 isShown 状态来执行此操作。

例如:

const ListItem = ({visible, onExpand}) => {
   return(
      <div>
          <button onClick={onExpand}>Expand</button>
          {visible && <p>your content</p>}
      </div>
   );
}

const List = ({items}) => {
   const [visibleIdx, setVisibleIdx] = useState(-1);
   return (
       <div>
            <ListItem visible={visibleIdx == 0} onExpand={() => setVisibleIdx(0)} />
            <ListItem visible={visibleIdx == 1} onExpand={() => setVisibleIdx(1)} />
       </div>
   )
}

编辑: 可能不清楚我的意思。 React 组件形成树状层次结构。每个项目有 children。组件的状态由组件本身存储。您可以将这些组件向下传递给它的 children,但不能向上传递给它的 parent。 如果你需要从 parent 访问状态,唯一的解决方案是将其提升。这意味着您需要将状态移动到 parent 组件,并且该组件需要将状态传递给它的 children.