将数据从子组件传递到父组件 - react - 通过回调函数

IT技术 javascript reactjs
2021-04-11 14:16:17

通过回调函数将数据从子组件传递到父组件,但不知何故它不起作用。我在这里做错了什么?将数据从子组件传递到父组件 - react - 通过回调函数

https://codepen.io/silentarrowz/pen/GEMQEP?editors=0010

这是代码

class App extends React.Component{
    constructor(props){
      super(props);
      this.state={
        input:'this is the input for now'
      }
   //this.handleInput=this.handleInput.bind(this);   
    }

    handleInput(x){
      this.setState({
        input:x
      });
      alert(this.state.input);
    }

  render(){
    return(
      <div>
        <h1>Passing props from Child to Parent Component</h1>
        <Child getInput={this.handleInput} />
        here's the input: {this.state.input}
        </div>
    );
  }
 }

class Child extends React.Component{
  constructor(){
    super();
    this.state={
      text:''
        }
    }
  passingProps(e){
    var newInput=e.target.value;
    //alert(newInput);
   this.setState({
     text:newInput
    });
  this.props.getInput(this.state.text);
  }

  render(){
    return(
      <div>
      <input type="text" placeholder="please input a name..." onChange={this.passingProps} />

        </div>

    )
  }
}

ReactDOM.render(
  <App/>,
  document.getElementById('app')
);
6个回答

有几个问题。

1)你必须绑定 passingProps

constructor(){
    super();
    this.state={
      text:''
    }
    this.passingProps = this.passingProps.bind(this);
}

2)this.setState是异步的,因此不能保证this.state.text在您将其传递给this.props.getInput. 你可以做

this.props.getInput(newInput)

或者

this.setState({ text: newInput }, () => {
  this.props.getInput(this.state.text);
})

来解决这个问题。

@DonovanM 如果子类是函数而不是类怎么办?你能帮我 codeandbox.io/s/exciting-architecture-qkldm?file=/src/...
2021-05-25 14:16:17
@DonovanM 嗨,我遇到了类似的问题,但这并不能解决我的问题
2021-06-11 14:16:17
@JohnAnisere 你有什么问题?添加新问题可能会更容易
2021-06-14 14:16:17
谢谢。这真的很有帮助。我不知道 setState 是异步的
2021-06-16 14:16:17
class App extends React.Component{
constructor(props){
  super(props);
  this.state={
    input:'this is the input for now'
  }
  this.handleInput=this.handleInput.bind(this);   
}

handleInput(event){
  let value = event.target.value;
  this.setState({
    input:value
  });
}

render(){
   return(
     <div>
       <h1>{this.state.input}</h1>
       <Child getInput={this.handleInput} />
     </div>
   );
  }
}

 class Child extends React.Component{
   constructor(){
      super(props);
}

render(){
   return(
     <div>
     <input type="text" placeholder="please input a name..." onChange={this.props.getInput} />
    </div>

     )
   }
}

ReactDOM.render(
  <App/>,
  document.getElementById('app')
);

这是您的问题的答案。我希望你的问题得到解决。

在您的Child组件中,您编写了以下代码:

passingProps(e){
  var newInput=e.target.value;
  //alert(newInput);
  this.setState({
     text:newInput
  });
  this.props.getInput(this.state.text);
}

该问题是由于setState 函数异步行为造成的。这意味着你不能在一行上调用 setState 并期望它在下一行更新。使用 setState 的回调函数调用父组件的函数就像这样:

passingProps(e){
  var newInput=e.target.value;
  //alert(newInput);
  this.setState({ text: newInput }, () => {
     this.props.getInput(this.state.text);
  })
}

同样的事情发生在App 组件的handleInput函数中。

this不会自动绑定到您的传递props函数中。尝试使用箭头函数语法来绑定它。

passingProps = e => {
  var newInput=e.target.value;
  //alert(newInput);
  this.setState({
    text:newInput
  });
  this.props.getInput(this.state.text);
}

你需要纠正它的两件事:

  1. 如果要访问新状态,则不要使用this.state.inputafter this.setState({input: 'xxx'})这就是为什么不这样做的原因。
  2. this.passingProps = this.passingProps.bind(this)定义了什么this是当前范围。this在组件的函数中使用时this需要绑定。

更改密码笔