当前位置: 首页 > 知识库问答 >
问题:

如何使用React挂钩分别切换手风琴面板?

秦雅逸
2023-03-14

目前,所有手风琴面板正在同时切换。我尝试将索引传递给click处理程序,但没有成功。如何将当前索引与当前setActive变量进行比较,以分别打开和关闭手风琴面板?我在生产中使用的数据没有唯一的ID,这就是我使用索引的原因。谢谢你的建议!

演示:https://codesandbox.io/s/react-accordion-using-react-hooks-forked-fup4w?file=/components/Accordion.js:141-1323

const Accordion = (props) => {
  const [setActive, setActiveState] = useState(0);
  const [setHeight, setHeightState] = useState("0px");
  const [setRotate, setRotateState] = useState("accordion__icon");

  const content = useRef(null);

  const toggleAccordion = (index) => {
    setActiveState(setActive === index ? "active" : "");
    setHeightState(
      setActive === "active" ? "0px" : `${content.current.scrollHeight}px`
    );
    setRotateState(
      setActive === "active" ? "accordion__icon" : "accordion__icon rotate"
    );
  }

  return (
    <div>
      {data.map((item, index) => (
        <div key={index} className="accordion__section">
          <button
            className={`accordion ${setActive}`}
            onClick={() => toggleAccordion(index)}
          >
            <p className="accordion__title">{item.title}</p>
            <Chevron className={`${setRotate}`} width={10} fill={"#777"} />
          </button>
        <div
          ref={content}
          style={{ maxHeight: `${setHeight}` }}
          className="accordion__content"
        >
          <div>{item.content}</div>
       </div>
    </div>
    ))}
  </div>
  );
};

共有1个答案

龙兴贤
2023-03-14

代码中的问题是,您正在生成一个通用的setActive状态,然后将该状态传递给映射函数中的所有项。您必须更改您的状态管理,以便能够找到每个项目是否处于活动状态。我会返工一点你的组件:

const Accordion = (props) => {

  const [activeIndex, setActiveIndex] = useState(0);

  const content = useRef(null);
    
  return (
    <div>
      {data.map((item, index) => {
         const isActive = index === activeIndex
        return (
        <div key={index} className="accordion__section">
          <button
            className={`accordion ${isActive ? "active" : ""}`}
            onClick={() => setActiveIndex(index)}>
            <p className="accordion__title">{item.title}</p>
            <Chevron className={`${isActive ? "accordion__icon" : "accordion__icon rotate" }`} width={10} fill={"#777"} />
          </button>
        <div
          ref={content}
          style={{ maxHeight: `${isActive ? "0px" : `${content.current.scrollHeight}px`}` }}
          className="accordion__content">
          <div>{item.content}</div>
       </div>
    </div>
    )})}
  </div>
  );
};

这个想法是,对于循环中的每个项目,你找到哪个on是活动的,然后根据这个来分配类/样式。可以更重构,但我让你清理现在的想法应该有:)

 类似资料:
  • 我尝试了不同的方法。但是不要尝试切换这个css类。当我点击它时,书签应该会变成蓝色。到目前为止,我可以用onClick更改为false,但它不会切换回来。 这是ToggleBookmark组件集:

  • 手风琴效果其实就是通过JS改变元素的height,然后加上transition来让css动起来。 准备HTML结构 这里我们使用 dl , 因为 dt 刚好可以模拟标题, dd 模拟内容。 <div class="panel"> <dl> <dt>One Item</dt> <dd>One Item Content .</dd>

  • 我有一架手风琴很好用。我在想办法搜索手风琴的所有襟翼: 使用jQuery手风琴时在页面(Ctrl+F)上查找字符串 我已经在一个链接上使用了destroy方法,然后在另一个链接上重新初始化,但它将是伟大的切换这个与一个按钮。((我本来在这里问这个问题没有这个解决方案,所以下面的答案就是这样,看有没有更好的解决方案出来,我才会接受)) 我还能够用jQuery切换整个手风琴,但这只会使整个东西消失。我

  • 我正在使用jQuery手风琴来隐藏一些数据。 accordion标题是一个带有一些标题的表格。有一个标题,我不希望你点击它,因为手风琴事件会触发。 所以 手风琴是可折叠的,如果您单击Test2(类nofunction),手风琴事件不应触发。但是如果您单击Test或其他表头,手风琴应该会触发事件。 我可以添加这个功能吗? 更新测试http://jsfiddle.net/e3Q8d/,包括jQuery

  • 我有一个表单(带有一个boxlayout.y),它嵌套了ComponentGroup+手风琴+切换按钮。当用户展开手风琴(在ComponentGroup中)时,切换按钮列表(在手风琴中)很长,它不适合屏幕。 我的问题是如何在所有窗体中启用滚动。 下面的代码是代码结构的示例。实际代码是由我编写的复杂解析器生成的,该解析器从json输入自动生成UI:

  • jQueryUI中的Accordion Widget是一个基于jQuery的可扩展和可折叠内容持有者,它被分成几个部分,可能看起来像标签。 jQueryUI提供了accordion()方法来实现这一点。 语法 (Syntax) accordion()方法可以使用两种形式 - $(selector,context).accordion(options)方法 $(selector, context).