【问题标题】:Passing state value from component to component?将状态值从组件传递到组件?
【发布时间】:2018-03-14 07:39:41
【问题描述】:

我在这个网站、官方文档和许多其他地方看到了很多答案。但我无法取得成果。这就是我发布这个问题的原因。

所以,我的问题是我有 3 个文件名为: App.js、SignUp.js 和 Welcome.js。

我的任务是从 SignUp.js 页面获取表单中的值并将该值打印到 Welcome.js 组件。我阅读了有关提升状态和更高阶组件的信息,但无法做到。

感谢任何帮助。

这是我的代码:

App.js:

import React,{Component} from "react";
import {BrowserRouter as Router, Link, Switch, Route} from "react-router-dom";
import SignUp from './SignUp';
import Welcome from './Welcome';
class App extends Component {
  render(){
    var homeMessage = () =>{
      return(<div><SignUp /></div>);
    }
    return(
    <Router>
      <div>
        <Route exact path="/src/Welcome" component={Welcome}/>
        <Route exact path="/" component={homeMessage}/>
      </div>
    </Router>
    );
  }
}
export default App;

SignUp.js;

import React,{Component} from "react";
import {Link} from "react-router-dom";
export default class SignUp extends Component {
  constructor(props){
    super(props);

    this.state = {
      firstName:''
    };
  }
  inputData = event =>
  {
    this.setState({
      [event.target.name]:event.target.value
    });
  }
  submitData = event =>
  {
    event.preventDefault();
  }
  render(){
    return(
      <div>
        <form onSubmit={this.submitData}>
          <input type="text" name="firstName" onChange={this.inputData}/>
          <button type="submit"> Submit</button>
        </form>
        <Link to="/src/Welcome">Welcome</Link>
      </div>
    );
  }
}

Welcome.js:

    import React,{Component} from "react";
    import SignUp from './SignUp';
    export default class Welcome extends Component {
      render(){
        return(
          <div>
            {this.state.firstName}
          </div>
        );
      }
    }

“如果可能的话,请给出答案,然后仅以反应方式而不是 redux 或任何其他库。因为根据 Dan Abramov 文章“Thinking in React”,所以首先我想尝试所有范围仅在反应中可用。”

【问题讨论】:

    标签: javascript reactjs react-router


    【解决方案1】:

    将数据从SignUp 组件传回父组件,然后将其作为道具传递给 Welcome 组件。另一种方式是将 SignUp 组件状态存储在App 组件中,这样提交时就不需要再传回来了。

    App.js

    import React,{Component} from "react";
    import {BrowserRouter as Router, Link, Switch, Route} from "react-router-dom";
    import SignUp from './SignUp';
    import Welcome from './Welcome';
    
    
    class App extends Component {
      state = {
         firstName: ''
      }
      onSignIn = (value) => {
          this.setState({firstName: value});
      }
      render(){
    
        return(
        <Router>
          <div>
            <Route exact path="/src/Welcome" render={(props) => <Welcome firstName={this.state.firstName} {...props}/>}/>
            <Route exact path="/" render={(props) =>{
       return(<div><SignUp onSignIn={this.onSignIn} {...props} /></div>);
    }}/>
          </div>
        </Router>
        );
      }
    }
    export default App;
    

    SignUp.js

    export default class SignUp extends Component {
      constructor(props){
        super(props);
    
        this.state = {
          firstName:''
        };
      }
      inputData = event =>
      {
        this.setState({
          [event.target.name]:event.target.value
        });
      }
      submitData = event =>
      {
        event.preventDefault();
        this.props.onSignIn(this.state.firstName);
      }
      render(){
        return(
          <div>
            <form onSubmit={this.submitData}>
              <input type="text" name="firstName" onChange={this.inputData}/>
              <button type="submit"> Submit</button>
            </form>
            <Link to="/src/Welcome">Welcome</Link>
          </div>
        );
      }
    }
    

    Welcome.js

    import React,{Component} from "react";
    import SignUp from './SignUp';
    export default class Welcome extends Component {
      render(){
        return(
          <div>
            {this.props.firstName}
          </div>
        );
      }
    }
    

    一些有用的链接:

    How to pass data from child component to its parent in ReactJS?

    Passing custom props to router component in react-router v4

    ReactJS - Lifting state up vs keeping a local state

    【讨论】:

    • 我遇到了一些错误,请看一下...@Shubhum Katri
    • TypeError: _this.props.onSignIn 不是函数。 (在 '_this.props.onSignIn(_this.state.firstName)' 中,'_this.props.onSignIn' 未定义)
    • @YChoksi 更新了答案,请检查。 home 没有定义 this.onSignIn
    • 在父组件中你只写了 state 而在子组件中你写了 this.state 为什么?另一件事是,如果我有很多像 14-15 这样的状态变量,并且在很多深处都需要。请问这种方法好吗?
    • @YChoksi,它们是同一个东西,在父级中,状态被定义为类字段,而在子级中,它在构造函数中定义,您可以遵循其中任何一个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2021-01-11
    • 2018-03-07
    • 1970-01-01
    • 2019-12-11
    • 2019-02-17
    相关资源
    最近更新 更多