【发布时间】:2017-10-17 11:28:34
【问题描述】:
我正在使用 React 制作一个可折叠的列表。到目前为止它有效,但现在我想实现一个展开/折叠所有内容的按钮。因此按钮需要调整所有元素的状态。我不确定解决这个问题的最佳方法是什么。这就是我所拥有的:
import React, {Component} from 'react';
class CollapsibleList extends Component {
constructor(props) {
super(props);
this.state = {
collapsed: true
};
this.subLists = [];
this.papers = [];
if (this.props.subtitles) {
for (let subList of this.props.subtitles) {
this.subLists.push(
<CollapsibleList level={this.props.level + 1} subtitles={subList.subtitles} title={subList.title}/>
);
}
}
this.toggleCollapse = this.toggleCollapse.bind(this);
this.expandAll = this.expandAll.bind(this);
this.collapseAll = this.collapseAll.bind(this);
}
expandAll() {
this.setState({collapsed: false});
this.subLists.forEach(subList => subList.expandAll());
}
collapseAll() {
this.setState({collapsed: true});
this.subLists.forEach(subList => subList.collapseAll());
}
toggleCollapse() {
this.setState(prevState => {
return {collapsed: !prevState.collapsed};
});
}
render() {
return (this.state.collapsed ?
<li className={'collapsibleListItem'}>
<div onClick={this.toggleCollapse}>
{this.props.title}
</div>
<img title={'Expand all'} className={'icon'} alt={'Expand all'} src={require('../expand_all.png')} onClick={this.expandAll}/>
<img title={'Collapse all'} className={'icon'} alt={'Collapse all'} src={require('../collapse_all.png')} onClick={this.collapseAll}/>
</li> :
<li className={'collapsibleListItem'}>
<div onClick={this.toggleCollapse}>
{this.props.title}
</div>
<img title={'Expand all'} className={'icon'} alt={'Expand all'} src={require('../expand_all.png')} onClick={this.expandAll}/>
<img title={'Collapse all'} className={'icon'} alt={'Collapse all'} src={require('../collapse_all.png')} onClick={this.collapseAll}/>
<ul className={'collapsibleList'}>
{this.subLists}
</ul>
</li>
);
}
}
export default CollapsibleList;
不幸的是,这似乎不起作用。
【问题讨论】:
-
你遇到了什么错误?
-
您可以显示折叠列表的屏幕截图吗?
-
我不明白,为什么你需要使用递归渲染?您可以在本地状态下使用具有属性
collapsed的父组件。如果是collapsed,则只渲染按钮。如果不是 collapsed,则在循环中渲染子组件(例如子列表)。像这样(在父组件中)let subLists = subLists.map(list=> { return <SubList list={list} /> })return ({subLists})
标签: reactjs recursion children