Подтвердить что ты не робот

ReactJS с ES6: this.props не является функцией, когда я связываю два компонента

Я работаю с ReactJS с ES6, но у меня есть некоторые проблемы с передачей child > parent через реквизиты. Пример моего подхода:

class SearchBar extends React.Component {
  handler(e){
    this.props.filterUser(e.target.value);
  }

  render () {
  return <div>
    <input type='text' className='from-control search-bar' placeholder='Search' onChange={this.handler} />
  </div>
  }
}


export default class User extends React.Component {
  constructor(props) {
    super(props);
    this.state = {name: '', age: '', filter: ''};
  } 

  filterUser(filterValue){
    this.setState({
      filter: filterValue
    });
  }

  render() {
    return <div>
      <SearchBar filterUser={this.filterUser} />
      <span>Value: {this.state.filter}</span>
    </div>
  }
}

Это возвращает Uncaught TypeError: this.props.filterUser is not a function.

Любая идея? Возможно, привязка?

[EDIT] Решение (спасибо @knowbody и @Felipe Skinner):

Я потерял привязку в моем конструкторе. Связывание в конструкторе SearchBar отлично работает.

Используя React.createClass() (ES5), он автоматически привязывает к this для ваших функций. В ES6 вам нужно привязать this вручную. Подробнее https://facebook.github.io/react/docs/reusable-components.html#es6-classes

4b9b3361

Ответ 1

Вам не хватает привязки в вашем конструкторе, также вам не нужно передавать props, если вы не используете их в конструкторе. Также вам нужно import { PropTypes } from 'react'

class SearchBar extends React.Component {

  constructor() {
    super();
    this.handler = this.handler.bind(this);
  }

  handler(e){
    this.props.filterUser(e.target.value);
  }

  render () {
    return (
      <div>
        <input type='text' className='from-control search-bar' placeholder='Search' onChange={this.handler} />
      </div>
    );
  }
}


export default class User extends React.Component {
  constructor() {
    super();
    this.filterUser = this.filterUser.bind(this);
    this.state = { name: '', age: '', filter: '' };
  } 

  filterUser(filterValue){
    this.setState({
      filter: filterValue
    });
  }

  render() {
    return ( 
      <div>
        <SearchBar filterUser={this.filterUser} />
        <span>Value: {this.state.filter}</span>
      </div>
    );
  }
}

Ответ 2

Когда вы используете React.createClass(), он автоматически делает привязки к этому для ваших функций.

Поскольку вы используете синтаксис класса ES6, вам необходимо выполнить эти привязки самостоятельно. Здесь два варианта:

render() {
    return <div>
      <SearchBar filterUser={this.filterUser.bind(this)} />
      <span>Value: {this.state.filter}</span>
    </div>
  }

Или вы можете привязать его к своему конструктору так:

constructor(props) {
    super(props);
    this.state = {name: '', age: '', filter: ''};
    this.filterUser = this.filterUser.bind(this);
  } 

Вы можете прочитать об этом в документации: https://facebook.github.io/react/docs/reusable-components.html#es6-classes

Обратите внимание, что эти два варианта являются взаимоисключающими.

Ответ 3

В моем случае я неправильно импортировал компонент. У меня есть компоненты "HomeAdmin" и "Регистрация".

У меня было это в HomeAdmin.js: import { Register } from "/path/to/register"

Поменял на это и сработало: import Register from "/path/to/register"