2017-03-07 65 views
1

我试图在显示弹出div的网页上有一个按钮。弹出窗口上还有一个隐藏按钮。在reactjs中做到这一点的正确方法是什么?我的想法是在按钮上有一个状态来切换弹出窗口的可见性,而弹出窗口修改它。子类中的访问状态

var Parent = React.createClass({ 
    getInitialState: function() { 
     return {visible: false}; 
    }, 
    buttonOnClick: function() { 
     if(this.state.visible == true) 
      this.setState({visible: false}); 
     else 
      this.setState({visible: true}); 
    }, 
    render: function() { 
     var elem; 
     if(this.state.visible) 
      elem = <Popup/> 
     else 
      elem = ""; 
     ... 
     {elem} 
    } 
} 

var Popup = React.createClass({ 
    closeButtonOnClick: function() { 
     this.setState({visible: false}); //this.state is null! 
    } 
    render: function() { 
     ... 
    } 
}); 

但是,我不能从子类访问状态,并把它当作道具似乎并没有工作,要么(按值传递,而不是引用)。我应该怎么做?

回答

3

相反父组件的访问状态直接,只是通过设置setState({visible: false})传递回调到<Popup>onClose其中<Parent>手柄:

var Parent = React.createClass({ 
    getInitialState: function() { 
     return {visible: false}; 
    }, 
    buttonOnClick: function() { 
     if(this.state.visible == true) 
      this.setState({visible: false}); 
     else 
      this.setState({visible: true}); 
    }, 
    handlePopupClose: function() { 
     this.setState({visible: false}); 
    }, 
    render: function() { 
     var elem; 
     if(this.state.visible) 
      elem = <Popup onClose={this.handlePopupClose}/> 
     else 
      elem = ""; 
     ... 
     {elem} 
    } 
} 

var Popup = React.createClass({ 
    closeButtonOnClick: function() { 
     this.props.onClose(); 
    } 
    render: function() { 
     ... 
    } 
}); 
+0

讲出了我的嘴:) –

+0

的啊我看,你传递一个回调。谢谢! – dukevin

+0

我还有一个问题:如果我的DOM看起来像 '体 >弹出容器 > DIV >> DIV2 >>> DIV3 >>>> DIV4 ' 我想从DIV4控制弹出知名度或其他divs,我是否需要将回调传递到每个将生成弹出窗口的元素? – dukevin