【问题标题】:reactjs transferring the data between two components [duplicate]reactjs在两个组件之间传输数据[重复]
【发布时间】:2017-10-31 22:31:58
【问题描述】:

在 react js 中,我有 2 个组件。

在 Component1.jsx 中:

import Info from Component2.jsx; 
... 
...
var dataInfo = "some info.. ";
<Info dataInfo={dataInfo} />
...
... 

在上面的代码中,我们将表单 props 中的数据从 component1.jsx 传输到 component2.jsx

我们可以用同样的方式将 data 传回 component2.jsx 到 component1.jsx 吗?

请帮帮我。我试图在谷歌中找到答案,但无法正确找到。

【问题讨论】:

  • 请用更连贯完整的代码 sn-p 重新表述您的问题。包含足够的代码,以便组件的结构和使用方式一目了然。
  • 感谢您提供参考链接。我解决了..

标签: reactjs


【解决方案1】:

是的,您可以转移回父组件, 我会给你一个例子来清楚地展示你如何做到这一点

假设您有一个名为 component1 的父级,并且它有一个作为子级导入的名为 component2 的表单

如下:


import React, { Component } from 'react';
export default class Component2 extends Component{

constructor() {
    super();

    this.state = {
        UserName: '',
        email: ''
    };
    this.onSubmit = this.onSubmit.bind(this)
}

onSubmit(e){
    e.preventDefault();
    var field = {
        UserName:  this.state.UserName,
        email :   this.state.email,
        password:  this.state.password,
    }
    **this.props.onUpdate(field);**
}
onChange(e){
    this.setState({
        [e.target.name]: e.target.value
    });
}
render() {
    var UserNameError = **this.props.UserNameError**;
    var emailError = **this.props.emailError**;

    return(

        <div className="col-md-6 col-sm-6">
            <div className="title">Create Account</div>
            <Form onSubmit={this.onSubmit}>
                <div className="form-group">
                    <label>user Name</label>
                    <input onChange={this.onChange.bind(this)} value={this.state.UserName} name='UserName'/>
                    <span className="error is-visible">{UserNameError}</span>
                </div>
                <div className="form-group">
                    <label>Email</label>
                    <input onChange={this.onChange.bind(this)} value={this.state.email} name='email' />
                    <span className="error is-visible">{emailError}</span>
                </div>

                <Button className='btn submit'>Register</Button>
            </Form>
        </div>
    )
}}

import React, { Component } from 'react';
import Component2 from './Component2'
export default class Component1 extends Component{
    constructor() {
        super();
        this.state = {
            UserName: '',
            email: '',
            UserNameError:' UserNameError ',
            emailError:' emailError '
        };
    }
    onUpdate(val) {
        this.setState({
            email: val.email,
            UserName: val.UserName,
        });
        console.log(' onSubmit  ** email' + val.email + " UserName " + val.UserName )
    };
    render() {
        return(
            <div className="col-md-6 col-sm-6">
                <Component2 **UserNameError={this.state.UserNameError}** **emailError={this.state.emailError}** **onUpdate={this.onUpdate.bind(this)}**  />
            </div>
        )

    }
}

我在句子周围加了星号,以注意我如何将数据错误从父组件 1 传输到组件 2

以及如何通过 onUpdate 函数将表单数据从子组件 2 发送到组件 1

【讨论】:

  • 感谢您的代码。我已经实现了相同的模式,但最终出现错误“setState(...):在现有状态转换期间无法更新(例如在render 或另一个组件的构造函数中)。渲染方法应该是道具和状态的纯函数; 构造函数的副作用是一种反模式,但可以移动到componentWillMount."。当您调用 onUpdate(val) { this.setState({...}) } 时会发生该错误。还有其他方法吗,我们可以将 onUpdate() 函数中的值存储到 setState 吗?
  • 是的,你是对的,我更新了代码,你现在可以使用代码没有任何错误,我试过了。抱歉,当您在输入标签中写入时,我忘记设置 onChange 函数以获取新值,我还发现了另一件事,我使用变量 {UserNameError } 而不是 {this.state.UserNameError } 更新了代码,与电子邮件错误,
  • 感谢您的更新。我会调查的...
  • 嗨,Asmaa,我指的是您的代码。当在父类中调用函数“onUpdate()”时,您将值存储在状态中。对我来说,当我以同样的方式强化状态值时,页面会一次又一次地重新渲染/刷新。你能在这里建议我有什么问题吗?
  • 欢迎再次 B77,是的,我有一个解决方案供您首先检查您是否已将孩子的 val 保存在父母中,如以下代码,它将阻止刷新更多次。 if(this.state.email != val.email){ this.setState({ email: val.email, UserName: val.UserName, }); }
猜你喜欢
  • 2018-03-25
  • 2020-10-16
  • 2017-07-09
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
相关资源
最近更新 更多