如何制作嵌套手风琴?
语义_UI-反应库中存在组件Accordion。有一些例子,但我必须做嵌套的手风琴,它有结构:
-accordion:
-sub_accordion1
-sub_accordion2
-sub_accordion3
我看到了带有面板的嵌套手风琴的例子,但我不想将手风琴放到面板中。我试过了:
export default class AccordionExampleStandard extends Component {
state = { activeIndex: 0 }
handleClick = (e, titleProps) => {
const { index } = titleProps
const { activeIndex } = this.state
const newIndex = activeIndex === index ? -1 : index
this.setState({ activeIndex: newIndex })
}
render() {
const { activeIndex } = this.state
return (
<Accordion>
<Accordion.Title active={activeIndex === 0} index={0} onClick={this.handleClick}>
<Icon name='dropdown' />
What is a dog?
</Accordion.Title>
<Accordion.Content active={activeIndex === 0}>
<Accordion.Title active={activeIndex === 1} index={1} onClick={this.handleClick}>
<Icon name='dropdown' />
What kinds of dogs are there?
</Accordion.Title>
<Accordion.Content active={activeIndex === 1}>
Content1
</Accordion.Content>
<Accordion.Title active={activeIndex === 2} index={2} onClick={this.handleClick}>
<Icon name='dropdown' />
How do you acquire a dog?
</Accordion.Title>
<Accordion.Content active={activeIndex === 2}>
Content2
</Accordion.Content>
<Accordion.Title active={activeIndex === 3} index={3} onClick={this.handleClick}>
<Icon name='dropdown' />
What kinds of dogs are there?
</Accordion.Title>
<Accordion.Content active={activeIndex === 3}>
Content3
</Accordion.Content>
</Accordion.Content>
</Accordion>
)
}
}
它呈现组件,但我只能折叠主手风琴,不能折叠它的子项。如何执行此功能?
解决方案
既然您提到需要一个简单的解决方案,最好使用panels
,因为它们似乎会自动操作activeIndex
,而activeIndex
是决定手风琴展开和折叠的主要属性。如果要像上面那样自己操作,则需要维护所有层次结构,并通过调整onClick
处理程序中的状态来控制自己。因此,如果您的用例不是定制的或复杂的,您可以尝试如下所示。
这是一个有效的演示NESTED ACCORDION SEMANTIC UI
import { Accordion } from 'semantic-ui-react';
const AccordionContent = (content) => (
<div className="indent">
{content}
</div>
)
const SubAccordion1Panels = [
{
title: 'Sub Accordion 11',
content: { content: AccordionContent('11 Content'), key: '11-content'} ,
key: 'sub-accordion-11'
}, {
title: 'Sub Accordion 12',
content: { content: AccordionContent('12 Contents'), key: '12-content' },
key: 'sub-accordion-12'
}, {
title: 'Sub Accordion 13',
content: { content: AccordionContent('13 Contents'), key: '13-content' },
key: 'sub-accordion-13'
},
]
const SubAccordion1Content = (
<div className="indent">
<Accordion.Accordion
style={{marginLeft: "20px"}}
className="no-padding"
panels={SubAccordion1Panels}
/>
</div>
)
const SubAccordionPanels = [
{
title: 'Sub Accordion 1',
content: { content: SubAccordion1Content, key: 'sa1-content' },
key: 'sub-accordion-1'
}, {
title: 'Sub Accordion 2',
content: { content: AccordionContent('SA2 Content'), key: 'sa2-content' },
key: 'sub-accordion-2'
}, {
title: 'Sub Accordion 3',
content: { content: AccordionContent('SA3 Content'), key: 'sa3-content' },
key: 'sub-accordion-3'
}
]
const SubAccordions = (
<div className="indent">
<Accordion.Accordion
className="no-padding"
panels={SubAccordionPanels}
/>
</div>
)
const AccordionPanels = [
{ title: 'Accordion', content: { content: SubAccordions, key: 'sub-accordions' } },
]
const AccordionExampleNested = () => (
<Accordion
defaultActiveIndex={0}
panels={AccordionPanels}
/>
)
class App extends React.Component {
render() {
return (
<AccordionExampleNested />
)
}
}
此外,对于缩进,您需要覆盖默认的css
.indent {
margin-left: 1em;
}
.no-padding {
padding: 0px !important;
margin: 0px !important;
}
相关文章