如何从子组件调用父组件中的方法?

How to call methods in Parent component from Child component?

我有一个元素,一个名为 <NormalTextField/> 的子组件,但是如何从其父组件 <Home/> 调用方法 -- _handleFirstName_handleLastName?我试图让用户输入一个文本,它会被发送出去在 Reducer 中创建一个对象 user,其中包含 firstNamelastName.

<Home/> 我有以下内容:

  _handleFirstName(event){
    this.props.actions.updateFirstName(event.target.value)
  }

  _handleLastName(event){
    this.props.actions.updateLastName(event.target.value)
  }

render(){
 return(
  <NormalTextField
    hint='Enter First Name'
    onChange={this._handleFirstName.bind(this)}
    value={this.props.user.firstName}
  />

  <NormalTextField
    hint='Enter Last Name'
    onChange={this._handleLastName.bind(this)}
    value={this.props.user.lastName}
  />

然后在我的元素中<NormalTextField/>,

import React, { Component } from 'react'

import { TextField } from 'material-ui'
import { orange900 } from 'material-ui/styles/colors'

class TextFieldLabel extends Component {
  static propTypes = {
    hint: React.PropTypes.string,
    onChange: React.PropTypes.func
  }

  _handle(event){
    this.props.onChange(event.target.value)
  }


  render() {
    var pr = this.props
    var hint = pr.hint
    var value = pr.value

    return (
      <TextField
        hintText={hint}
        onChange={this._handle.bind(this)}
        value={value}
      />
    )
  }
}

export default NormalTextField

但是一旦用户输入文本,我就会收到以下错误:Uncaught: TypeError: Cannot read property 'value' of undefined for _handleFirstName(event)。我究竟做错了什么?这是正确的方法吗?子组件是否可以调用父组件的方法?

您遇到的问题是当 event.target.value 接受 event 时,您将 event.target.value 传递给 _handleFirstName。您可以将 _handle 更改为:

  _handle(event) {
    this.props.onChange(event)
  }

或者,理想情况下,您可以删除 NormalTextField 中的事件处理程序,直接使用 onChange 属性。

首先将绑定调用移至构造函数:

constructor() {
  super();
  this._handleFirstName = this._handleFirstName.bind(this);
  this._handleLastName= this._handleLastName.bind(this);
}

 _handleFirstName(event){
    this.props.actions.updateFirstName(event.target.value)
  }

  _handleLastName(event){
    this.props.actions.updateLastName(event.target.value)
  }

// remove .bind(this) from your onChange
render(){
 return(
  <NormalTextField
    hint='Enter First Name'
    onChange={this._handleFirstName}
    value={this.props.user.firstName}
  />

  <NormalTextField
    hint='Enter Last Name'
    onChange={this._handleLastName}
    value={this.props.user.lastName}
  />

将您的 NormalTextField 更改为:

class TextFieldLabel extends Component {
  static propTypes = {
    hint: React.PropTypes.string,
    onChange: React.PropTypes.func
  }

  // _handle removed

  render() {
    var pr = this.props
    var hint = pr.hint
    var value = pr.value

    return (
      <TextField
        hintText={hint}
        onChange={this.props.onChange} // use prop directly
        value={value}
      />
    )
  }
}