首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将子组件的窗体值传递给父组件

如何将子组件的窗体值传递给父组件
EN

Stack Overflow用户
提问于 2019-01-29 11:45:19
回答 3查看 2.6K关注 0票数 3

是否有一种方法可以将表单数据从子组件传递到父组件,其中父组件中保留了提交按钮。

注意:-我不想为此使用ref,因为ref会浪费那么多内存,我可能在父母中有6-7个孩子。

我创造了一个类似的情况,以显示我被困在什么。

代码语言:javascript
复制
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>
        )
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-29 12:07:15

当然,这个概念叫做提升国家地位。基本上,您的<App />组件将保存来自两个组件的数据。我要简化一点,但你应该明白我在做什么。

FirstChildForm.js

<input type="text" name="username" onChange={e => props.updateData('user', e.target.value)}

SecondChildForm.js

<input type="password" name="password" onChange={e => props.updateData('pass', e.target.value)}

App.js

代码语言:javascript
复制
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>
        );
    }
}

<App />组件是真理的来源。请注意:

通过提升状态,<FirstChildForm /><SecondChildForm />不再需要是基于类的组件了,它们可以是功能组件。如果您想让它们保持基于类的状态,请将props.updateData更改为this.props.updateData,否则它将无法工作。

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

票数 3
EN

Stack Overflow用户

发布于 2019-01-29 12:31:32

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

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

下面的示例

家长:

代码语言:javascript
复制
    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>
  )
}
}

儿童:

代码语言:javascript
复制
 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>
);
}
}
票数 1
EN

Stack Overflow用户

发布于 2019-01-29 12:15:00

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

代码语言:javascript
复制
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 } }))
    }

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

代码语言:javascript
复制
{
    'firstForm': {
        'name': '',
        'password': ''
    },
    'secondForm': {
        'name': '',
        'password': ''
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54420336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档