【问题标题】:React recursively call method on children对孩子递归调用方法做出反应
【发布时间】: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=&gt; { return &lt;SubList list={list} /&gt; }) return ({subLists})

标签: reactjs recursion children


【解决方案1】:

我无法理解您要在代码中做什么,但您应该有 2 个不同的组件;一个用于列表,一个用于列表项。应该是这样的:

// Parent component
import React from 'react';
import ListItem from './ListItem';

class List extends React.Component {
  constructor() {
    super();

    this.state = {
      collapsed: false
    }
  }

  render() {
    const data = ['abc', 'def', 'ghi']; // whatever you want to have

    return(
      <div>
        <button onClick={() => this.setState({collapsed: !this.state.collapsed})}>
          Collapse
        </button>
        <ul>
          {
            this.state.collapsed &&
            data.map((val, key) => {
              return(
                <li>
                  <ListItem value={val} key={key} />
                </li>
              )
            })
          }
        </ul>
      </div>
    )
  }
}

这是子组件

// child component
import React from 'react';

class ListItem extends React.Component {
  constructor() {
    super();
  }

  render() {
    return(
      <div>
        {/*// render anything you want*/} 
        <p>{this.props.value}</p>
      </div>
    )
  }
}

export default ListItem;

这段代码只是为了给你一个洞察力。

【讨论】:

  • 好吧,我也想将可折叠列表作为列表项。因此,每个列表项也可以折叠/展开。现在我只想创建一个折叠整个列表的按钮,因此也包括所有可折叠的子列表。为了实现这一点,我也想在每个子列表上调用 collapseAll() 但这似乎不起作用......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多