目前,所有手风琴面板正在同时切换。我尝试将索引传递给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>
);
};
代码中的问题是,您正在生成一个通用的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).