【问题标题】:How to pass Child Component's form value to Parent Component如何将子组件的表单值传递给父组件
【发布时间】:2019-01-29 11:45:19
【问题描述】:

有没有办法将表单数据从子组件传递到父组件,其中提交按钮已保存在父组件中。

注意:- 我不想为此使用 ref,因为 ref 会浪费太多内存,而且我的父级可能有 6-7 个孩子。

我创造了一个类似的情况来显示我被困在什么地方。

class FirstChildForm extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            data: []
        }
    }

    render() {
        return (
            <div className="form">
                <input type="text" placeholder="Enter your name..." />
                <input type="password" placeholder="Enter password" />
            </div>
        )
    }
}


class SecondChildForm extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            data: []
        }
    }

    render() {
        return (
            <div className="form">
                <input type="text" placeholder="Enter your name..." />
                <input type="password" placeholder="Enter password" />
            </div>
        );
    }
}



export default class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            data: []
        }
    }

    handleSubmit = () => {

    }

    render() {
        return (
            <div className="parent">
                <FirstChildForm />
                <SecondChildForm />

                <button onClick={this.handleSubmit}> Submit</button>
            </div>
        )
    }
}

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    当然,这个概念叫做lifting the state up。基本上,您的 &lt;App /&gt; 组件将保存来自两个组件的数据。我会简化一点,但你应该明白我在做什么。

    FirstChildForm.js

    &lt;input type="text" name="username" onChange={e =&gt; props.updateData('user', e.target.value)}

    SecondChildForm.js

    &lt;input type="password" name="password" onChange={e =&gt; props.updateData('pass', e.target.value)}

    App.js

    export default class App extends React.Component {
        constructor() {
            super();
            this.state = {
                user: '',
                pass: '',
            };
        }
    
        handleSubmit = () => {};
    
        updateData = (target, value) => {
            this.setState({ [target]: value });
        };
    
        render() {
            return (
                <div className="parent">
                    <FirstChildForm updateData={this.updateData} />
                    <SecondChildForm updateData={this.updateData} />
    
                    <button onClick={this.handleSubmit}> Submit</button>
                </div>
            );
        }
    }
    

    &lt;App /&gt; 组件是事实的来源。请注意:

    通过提升状态,&lt;FirstChildForm /&gt;&lt;SecondChildForm /&gt; 不再需要是基于类的组件,它们可以是函数式组件。如果您出于任何原因希望他们保持基于班级的状态,请将props.updateData 更改为this.props.updateData,否则它将不起作用。

    父级是我们定义函数的地方,子级是我们执行它的地方,基本上是向父级发送数据!

    【讨论】:

    • 感谢 Predrag。我没有想过在 onChange 上获取表单数据。我试图从父级触发子级事件,该事件获取所有表单数据,然后将其发送给父级。
    • 随时!一定要给这个概念一些爱,因为当你开始构建越来越大的东西时,它可能会给你带来问题。就像当你有嵌套 6 层的组件时,也许是时候考虑 redux 了!
    【解决方案2】:

    您必须将一个函数向下传递给您的子组件。您的孩子现在可以将这个函数从他们的 props 绑定到给定的字段。

    class FirstChildForm extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                data: []
            }
        }
    
        render() {
            return (
                <div className="form">
                    <input type="text" placeholder="Enter your name..." onChange={this.props.dataChanged('name')}/>
                    <input type="password" placeholder="Enter password" onChange={this.props.dataChanged('password')}/>
                </div>
            )
        }
    }
    
    
    class SecondChildForm extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                data: []
            }
        }
    
        render() {
            return (
                <div className="form">
                    <input type="text" placeholder="Enter your name..." onChange={this.props.dataChanged('name')}/>
                    <input type="password" placeholder="Enter password" onChange={this.props.dataChanged('password')}/>
                </div>
            );
        }
    }
    
    
    
    export default class App extends React.Component {
        constructor(props) {
            super(props);
            this.state = {
                data: []
            }
        }
    
        handleChange = form => field => ev => {
            this.setState(prev => ({ [form]: { ...prev[form], [field]: ev.target.value } }))
        }
    

    您的父级的结果状态将具有以下结构:

    {
        'firstForm': {
            'name': '',
            'password': ''
        },
        'secondForm': {
            'name': '',
            'password': ''
        }
    }
    

    【讨论】:

      【解决方案3】:

      通过将函数作为 props 传递给子组件,并将子组件的状态作为参数传递给函数

      因为我不知道你到底想在里面编码什么,但只是为了理解结帐

      以下示例

      父母:

          export default class App extends React.Component {
        constructor(props){
          super(props);
          this.state = {
            data: []
          }
        }
      
      
          handleSubmit = () => {
      
        }  
        handleData = (newData) => {
          this.setState({data: newData});
      }
      
      render(){
        return (
        <div className="parent">
        <FirstChildForm / >
        <SecondChildForm  onSelectData={this.handleData}/>
      
        <button onClick={this.handleSubmit}> Submit</button>
        </div>
        )
      }
      }
      

      孩子:

       class SecondChildForm extends React.Component{
        constructor(props){
          super(props);
          this.state = {
            data:'hello'
          }
        }
      
        handleDataChange: function () {
          var newData = this.state.data
          this.props.onSelectData(newData);            
      },
      
      render(){
        return (
        <div className="form">
        <input type="text" placeholder="Enter your name..." />
        <input type="password" placeholder="Enter password" />
        <button onclick={this.handleDataChange}>submit</button>
        </div>
      );
      }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-10-05
        • 2020-02-04
        • 1970-01-01
        • 1970-01-01
        • 2020-03-30
        • 2018-05-01
        • 1970-01-01
        • 2022-11-24
        • 2021-09-20
        相关资源
        最近更新 更多