Как вызвать методы в родительском компоненте из дочернего компонента?

У меня есть элемент, дочерний компонент с именем <NormalTextField/>, но как вы можете вызвать методы - _handleFirstName а также _handleLastName от его родительского компонента <Home/>? Я пытаюсь, чтобы пользователь ввел текст, и он будет отправлен для создания объекта user в редукторе, который держит firstName а также lastName,

В <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 за _handleFirstName(event), Что я делаю неправильно? Это правильный подход и возможно ли для компонента Child вызывать методы Parent?

1 ответ

Решение

Проблема, которую вы видите в том, что вы проходите мимо event.target.value в _handleFirstName когда он принимает event, Вы можете просто изменить _handle на это:

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

Или, в идеале, вы можете удалить обработчик событий в вашем NormalTextFieldи просто используйте onChange prop напрямую.

Начнем с перемещения вызовов связывания в конструктор:

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}
      />
    )
  }
}
Другие вопросы по тегам