简体   繁体   English

如何在 React 的 3 个组件之间传递数据?

[英]How to pass data between 3 components on React?

Hey I am pretty noob at React.嘿,我是 React 的菜鸟。 This props and State stuff are eating my head.这个道具和 State 东西正在吃我的头。 Anyway, my problem is that, I have 3 Componenets "LoginForm", "InputField", "SubmitButton"无论如何,我的问题是,我有 3 个组件“LoginForm”、“InputField”、“SubmitButton”

What I need is, I want to pass "Username" and "Password" details to SubmitButton Component when the SubmitButton clicked.我需要的是,当单击 SubmitButton 时,我想将“用户名”和“密码”详细信息传递给SubmitButton组件。 I tried and succeded to pass data from InputField to LoginForm whenever the inputfield value changes, but couldn't do the same to " SubmitButton " Component.每当输入字段值更改时,我尝试并成功地将数据从InputField传递到LoginForm ,但无法对“ SubmitButton ”组件执行相同操作。

Thanks in Advance:)提前致谢:)

The code is here as follows.代码如下。

//LOGING FORM COMPONENT
class LoginForm extends React.Component {

    eventHandler = function (data) {
        console.log(data)
    }  

    render() {
        return (

            <div>
                <InputField onChange={this.eventHandler}/>
                <SubmitButton/>
            </div>
        )
    }
}

export default LoginForm;

//INPUT FIELD COMPONENT

class InputField extends React.Component {
    constructor(props){
        super(props);
        this.state={
            username:'',
            password:''
        };
        this.handleChange=this.handleChange.bind(this)
    }


handleChange = e => {
    this.setState({ [e.target.name]: e.target.value }, () => {
      if (this.props.onChange) {
        this.props.onChange(this.state);
      }
    })
  };

    render() {
        return (
            <div>
                <div>
                    <input name='username' onChange={this.handleChange}></input>

                </div>
                <div>
                    <input name='password' type='password' onChange={this.handleChange}></input>

                </div>


            </div>

        )
    }
}

export default InputField;

//SUBMIT BUTTON COMPONENT

class Submit_Button extends React.Component {

    constructor(props){
        super(props);
        this.loginBtn=this.loginBtn.bind(this)

    }
    loginBtn = function (data) {

        //Empty Because, dont know what to code xD
    }  

    render() {
        return (
            <div>
                <button onClick={this.loginBtn}>
                    Login</button>
                <svg class="bi bi-person" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
                    <path fill-rule="evenodd" d="M13 14s1 0 1-1-1-4-6-4-6 3-6 4 1 1 1 1h10zm-9.995-.944v-.002.002zM3.022 13h9.956a.274.274 0 00.014-.002l.008-.002c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664a1.05 1.05 0 00.022.004zm9.974.056v-.002.002zM8 7a2 2 0 100-4 2 2 0 000 4zm3-2a3 3 0 11-6 0 3 3 0 016 0z" clip-rule="evenodd" />
                </svg>
            </div>

        )


    }
}
export default Submit_Button;

SOLVED解决了

class LoginForm extends React.Component {
    constructor(props){
        super(props);
        this.state={
            username:'',
            password:''
        };

    }

    eventHandler = (data) =>{
        console.log(data)
        this.setState({
            username:data.username,
            password:data.password

    },
    console.log(this.state.username)) 

    }  

    render() {
        return (

            <div>
                <InputField onChange={this.eventHandler}/>
                <SubmitButton username={this.state.username} password={this.state.password}/>
            </div>
        )
    }
}

export default LoginForm;


class InputField extends React.Component {
    constructor(props){
        super(props);
        this.state={
            username:'',
            password:''
        };
        this.handleChange=this.handleChange.bind(this)
    }


handleChange = e => {
    this.setState({ [e.target.name]: e.target.value }, () => {
      if (this.props.onChange) {
        this.props.onChange(this.state);

      }
    },

    )
  };

    render() {
        return (
            <div>
                <div>
                    <input name='username' onChange={this.handleChange}></input>

                </div>
                <div>
                    <input name='password' type='password' onChange={this.handleChange}></input>

                </div>


            </div>

        )
    }
}

export default InputField;


class Submit_Button extends React.Component {

    constructor(props){
        super(props);
        this.loginBtn=this.loginBtn.bind(this)

    }
    loginBtn = function (data) {

        console.log( this.props.username, this.props.password)
    }  

    render() {
        return (
            <div>
                <button onClick={this.loginBtn}>
                    Login</button>
                <svg className="bi bi-person" width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
                    <path fillRule="evenodd" d="M13 14s1 0 1-1-1-4-6-4-6 3-6 4 1 1 1 1h10zm-9.995-.944v-.002.002zM3.022 13h9.956a.274.274 0 00.014-.002l.008-.002c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664a1.05 1.05 0 00.022.004zm9.974.056v-.002.002zM8 7a2 2 0 100-4 2 2 0 000 4zm3-2a3 3 0 11-6 0 3 3 0 016 0z" clipRule="evenodd" />
                </svg>
            </div>

        )


    }
}
export default Submit_Button;

Basically, it is a good idea to pass data from one child to another through their parent.基本上,通过父母将数据从一个孩子传递给另一个孩子是个好主意。

in this case, you can move the state from InputField to LoginForm and connect inputs to the state through InputField's props and make them controlled components.在这种情况下,您可以将 state 从 InputField 移动到 LoginForm 并通过 InputField 的 props 将输入连接到 state 并使其成为受控组件。 (you can read more about controlled components from here ) (您可以从此处阅读有关受控组件的更多信息)

then you can simply pass data from LoginForm's state to SubmitButton through its props.那么您可以简单地将数据从 LoginForm 的 state 通过它的道具传递给 SubmitButton。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM