【问题标题】:React: Children onclick to change parent's state for re-rendering反应:孩子点击改变父母的状态以重新渲染
【发布时间】:2016-12-18 02:20:07
【问题描述】:

我对 react 很陌生。我试图让父母根据状态更改显示的页面。我的子组件中有一个按钮,它应该向父组件发送“true”或“false”,以便它知道是否渲染它。我认为应该用这样的道具来完成:

this.state = {
   btnNewScreen: this.props.btnNewScreen //true or false
};

但我没有让它工作。你能给点建议吗?这是完整的父母 - 孩子

父级 - maindisplay.js

import React from 'react';
import Mainpage_Addscreen from '../components/subcomponents/mainpage-addscreen';
import Mainpage_Showscreens from '../components/subcomponents/mainpage-showscreens';
//
class MainDisplay extends React.Component {
    constructor() {
        super();
        this.state = {
            btnNewScreen: false //should be this.props.btnNewScreen?
        };
    }

    render() {
        var renderThis;
        if (!this.state.btnNewScreen) {
            renderThis =
                <div>
                    <Mainpage_Addscreen />
                    <Mainpage_Showscreens />
                </div>
        }
        else {
            //renderThis = <AddScreen />
            renderThis =
                <div>
                    <Mainpage_Addscreen />
                    <h3>Change to this when true (button click)</h3>
                </div>
        }
        return (
            <div>
                {renderThis}
            </div>
        );
      }
    }


    export default MainDisplay;

child - mainpage-addscreen.js

import React from 'react';

import Glyphicon from 'react-bootstrap/lib/Glyphicon';
import Button from 'react-bootstrap/lib/Button';

class Mainpage_Addscreen extends React.Component {
    constructor() {
        super();
        this.state = {
            btnNewScreen: true
        };
        this.newScreen = this.newScreen.bind(this);
    }

    newScreen(e) {
        this.setState({ btnNewScreen: !this.state.btnNewScreen });
        console.log(this.state.btnNewScreen);
    }
    render() {
        var text = this.state.btnNewScreen ? 'Add new' : 'Screens';
        return (
            <div className="main_window col-sm-offset-1 col-sm-10">
                <h3 id="addscreens">Screens: </h3>
                <Button id="addScreen" className="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown" onClick={this.newScreen}><Glyphicon id="refresh_screens" glyph="plus" />&nbsp; {text}</Button>
            </div>
        );
    }
}


export default Mainpage_Addscreen;

【问题讨论】:

    标签: reactjs components


    【解决方案1】:

    您需要做的是从父级向子级传递一个方法,当单击按钮时它可以调用。这个属于父类的方法会改变状态。
    在 MainPage.js 中

    changeButtonState(event) {
        this.setState({btnNewScreen: !this.state.btnNewScreen})
    }
    

    将此方法传递给您的子组件

    <Mainpage_Addscreen buttonClick={this.changeButtonState.bind(this)} />
    

    最后在子组件中,

    <Button ....   onClick={this.props.buttonClick} />
    

    【讨论】:

      【解决方案2】:

      您可能需要一个回调函数,您的父母将其作为道具传递给您的孩子,然后您的孩子可以调用它。

      类似这样的:

      // In parent
      constructor() {
        ...
        this.onChildClicked = this.onChildClicked.bind(this);
      }
      
      onChildClicked() {
        this.setState({childWasClicked : True });
      }
      
      render() {
        ...
        return (
          <div>
            <Child onClicked={this.onChildClicked} />
          </div>
        )
      }
      
      // In child
      render() {
        ...
        return (
          <div>
            <button onClick={this.props.onClicked} />
          </div>
        )
      }
      

      PS:我注意到你有一个大写的&lt;Button&gt; 组件。这通常适用于您自己定义的组件。标准 DOM 元素采用小写字母,例如&lt;div&gt;&lt;p&gt;

      【讨论】:

      • 他们特别有一个
      • 我认为您不需要onChildClicked() 上的括号,对吗?
      • 我相信这应该是: // In parent onChildClicked() { this.setState({childWasClicked : True }); } render() { ... return (
        ) } // 在子 render() { ... return (
        ) }
      • 感谢 cmets @Ray_Poly。编辑了答案;)
      猜你喜欢
      • 2016-07-07
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2021-08-26
      • 2019-11-19
      相关资源
      最近更新 更多