【问题标题】:ReactJS displaying / hiding parallel componentsReactJS 显示/隐藏并行组件
【发布时间】:2016-04-21 14:54:26
【问题描述】:

前言:我对 ReactJS 很陌生,所以我的问题将反映出我对事物的工作原理缺乏了解。现在我正在使用 React + Alt。

我有一个带有父组件(我称之为MyContainer)的基本页面,它有多个并排显示的并行面板式组件(MyPanel)。我现在要实现的是每个面板组件都有一个展开图标,单击该图标时,将使该面板占据其父容器的整个宽度(即width:100%)并隐藏所有其他面板(即:@987654324 @ 或 visibility:hidden)。再次单击该按钮时,将再次显示所有面板的初始状态。

所以我的问题是在 ReactJS/Alt 中实现这一点的正确方法。到目前为止,我已经完成了简单的部分,即监听展开按钮的单击并更新面板应该显示为正常还是全宽的状态。

export default class MyPanel extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      expanded: false
    };
    this.handleExpand = this.handleExpand.bind(this);
  }

  handleExpand() {
    this.setState({ expanded: !this.state.expanded });
  }

  render() {
    var expandStyle = {};
    if (this.state.expanded) {
        expandStyle.width = 'calc(100% - 40px)';
    }

    return(
      <div style={expandStyle}>
        <ExpandButton onExpandEvent={this.handleExpand} />
        {/* Rest of panel props data rendered here */} 
      </div>
    );
  }
}

我不知道该怎么做的部分是让这个组件告诉它的兄弟组件它们应该隐藏还是显示自己。试图在这里找到类似的问题,我认为有两种方法:使用父组件中的道具来跟踪哪些面板被隐藏或显示,或者使用 Store/Actions 来跟踪这一点,但是我不确定两者的实施。

再说一次,我是 ReactJS 的新手,所以请放轻松 :)

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    您有自己的方法来稍微扩展/隐藏:由于您的面板都包含在父组件中,因此该组件应决定单个面板是正常的、展开的还是隐藏的。您应该使用父组件的状态来完成此操作,而不是每个面板组件的状态。例如:

    var Container = React.createClass({
      getInitialState () {
        return {
          expandedPanel: null,
          panels: someArrayOfPanelData
        };
      },
      changeExpandedPanel (panelIndex) {
        return () => {
          this.setState({
            expandedPanel: panelIndex
          });
        };
      },
      render () {
        let panels = this.state.panels.map((panelData, i) => {
          return (
            <Panel 
              key={i} 
              data={panelData} 
              expanded={(i == this.state.panelExpanded)} 
              handleExpansion={this.changeExpandedPanel(i)}
            />
          );
        });
    
        return (
          <div>
            {panels}
          </div>
        );
      }
    });
    
    var Panel = React.createClass({
      propTypes: {
        ...,
        handleExpansion: React.PropTypes.function.isRequired
      },
      handleExpand () {
        this.props.handleExpansion();
      },
      render () {
        ...
      }
    });
    

    您在这里所做的是将父级的事件处理程序传递给子级。由于函数是在parent中定义的,所以它可以访问到parent的state/props等。

    【讨论】:

    • 谢谢。我不得不进行一些修改。首先,我从handleExpansion={this.changeExpandedPanel(i)} 中删除了(i),因为这将在初始渲染(并重新渲染)时为每个面板执行changeExpandedPanel。接下来,我将setState 拉到return() =&gt; 块之外,因为我无法让我的面板重新渲染。我使用的是 React.Component 而不是 Class,所以我不确定这是否与它有关。
    • 我试图做的是用正确的索引调用changeExpandedPanel,然后返回一个函数(引用该索引)在Panel 内进行回调。抱歉,您必须更改一些内容才能使其正常工作。
    • 是的,我将索引移到了 Panel 类中。我能够很好地弄清楚您的代码的意图。再次感谢!
    猜你喜欢
    • 2014-03-30
    • 2015-07-06
    • 2015-11-28
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多