【发布时间】:2021-09-10 00:22:31
【问题描述】:
我正在使用react-accessible-accordion 一次向用户呈现一个面板的表单。有一个“重置”按钮可以重置用户可能按下的任何按钮的影响。按钮位于面板内。您如何以编程方式折叠任何打开的面板? AccordionItem 有危险的SetExpanded 选项,但我没有看到任何实际使用的示例或该选项的完整文档(这就是option is described in the docs)。我是否必须在此处使用状态变量来使每个项目的展开折叠状态能够以编程方式对其进行操作?这是我现在拥有的代码的简化版本:
import React from 'react';
import ToggleButton from "react-bootstrap/ToggleButton";
import ButtonGroup from "react-bootstrap/ButtonGroup";
import 'bootstrap/dist/css/bootstrap.min.css';
import {Accordion, AccordionItem, AccordionItemHeading, AccordionItemButton, AccordionItemPanel} from 'react-accessible-accordion';
export const AccordionComponent = props => {
stateHooks = [React.useState(-1), React.useState(-1)]
const [ [varA, setVarA], [varB, setVarB] ] = stateHooks
const handleResetAccordion = e => {
e.preventDefault();
stateHooks.forEach(hook => { // pass -1 to each setter
hook[1]('-1'); // index 1 contains the setter
})
}
return (
<div className="accordion_container">
<Accordion allowZeroExpanded={true}>
<AccordionItem>
<AccordionItemHeading>
<AccordionItemButton> Panel #1 Title </AccordionItemButton>
</AccordionItemHeading>
<AccordionItemPanel>
<div className='radioQuestionCard'>
<h3>Question #1 Prompt:</h3>
<ButtonGroup className='radio' toggle id='q1'>
<ToggleButton key='0' type="radio" name="q1" value='0' checked={varA === '0'}
onChange={e => setVarA(e.currentTarget.value)} > Q1: Option1
</ToggleButton>
<ToggleButton key='1' type="radio" name="q1" value='1' checked={varA === '1'}
onChange={e => setVarA(e.currentTarget.value)} > Q1: Option2
</ToggleButton>
</ButtonGroup>
</div>
</AccordionItemPanel>
</AccordionItem>
<AccordionItem>
<AccordionItemHeading>
<AccordionItemButton> Panel #2 Title </AccordionItemButton>
</AccordionItemHeading>
<AccordionItemPanel>
<div className='radioQuestionCard'>
<h3>Question #2 Prompt:</h3>
<ButtonGroup className='radio' toggle id='q2'>
<ToggleButton key='0' type="radio" name="q2" value='0' checked={varB === '0'}
onChange={e => setVarB(e.currentTarget.value)} > Q2: Option1
</ToggleButton>
<ToggleButton key='1' type="radio" name="q2" value='1' checked={varB === '1'}
onChange={e => setVarB(e.currentTarget.value)} > Q2: Option2
</ToggleButton>
</ButtonGroup>
</div>
</AccordionItemPanel>
</AccordionItem>
</Accordion>
<button className='btn btn-danger btn-sm'
onClick={handleResetAccordion} id='resetAccordion'> Reset
</button>
</div>
)
}
【问题讨论】:
-
看起来你已经在使用重置功能了。 “以编程方式折叠任何打开的面板”是什么意思?你想什么时候把它们全部折叠起来?
-
用例是有人正在使用面板中的按钮进行选择,然后意识到他们想要重置所有答案。这些都是通过 handleResetAccordion 方法完成的,但我也希望打开的面板也可以关闭。这目前使打开的面板保持打开状态。
-
您是否尝试在
AccordianItems 上添加dangerouslySetExpanded属性?其他几件事 - 文档说dangerouslySetExpanding,但这是错误的。在上面,您正在检查项目 b 中的 varA,可能只是一个伪代码拼写错误。看看这里的代码 - github.com/springload/react-accessible-accordion/tree/master/… - 你可以看到道具是如何使用的。 -
@MarkSwardstrom 我在原始问题中链接到该示例,但它是手动分配,而不是编程。换句话说,您可以从一开始就强制打开某些面板,但这不是动态的,并且手风琴不能再被用户操作。 dangerouslySetExpanded 标志的用例非常狭窄。