"setState on undefined" эта ошибка при попытке использовать компонент реакции в стиле es6 в гибкой среде Yahoo

РЕДАКТИРОВАТЬ: Моя ошибка, мой веб-пакет hotloader почему-то кэшировал старый JS каждый раз, когда я запускал сборку. Сброс и восстановление и, кажется, работает сейчас.

Я пытаюсь создать простое окно поиска, используя объявление класса в стиле es6, в приложении Yahoo. Я работаю над примером todo, преобразовываю его в синтаксис стиля es6 и получаю сообщение об ошибке this.setState в _onChange метод. Я связал функции с "этим" в конструкторе, но все еще получаю ошибку.

import React from 'react';
import searchProducts from '../actions/searchProducts';

const ENTER_KEY_CODE = 13;

class SearchBox extends React.Component {

    static contextTypes = {
        executeAction: React.PropTypes.func.isRequired
    };

    static propTypes = {
        text: React.PropTypes.string
    };

    static defaultProps = {
        text:''
    };

    constructor(props) {
        super(props);
        this.state = {
            text: props.text
        };
        this._onChange = this._onChange.bind(this);
        this._onKeyDown = this._onKeyDown.bind(this);
    }

    render() {
        return (
            <input
                className="search-box"
                name="search-keyword"
                value={this.state.text}
                onChange={this._onChange}
                onKeyDown={this._onKeyDown}
            />
        );
    }

    _onChange(event, value) {
        console.log( event.target.value);

        //error is here///////////////////////////////////////////////////
        this.setState({text: event.target.value}); 
    }

    _onKeyDown(event) {
        if (event.keyCode === ENTER_KEY_CODE) {
            event.preventDefault();
            event.stopPropagation();

            var text = this.state.text.trim();
            if (text) {
                this.context.executeAction(searchProducts, {
                    text: text
                });
            }
            this.setState({text: ''});
        }
    }

}


export default SearchBox;

2 ответа

Изменить: игнорировать. Я полностью пропустил ту часть конструктора, где вы связали методы. Хм.. Что именно говорит сообщение об ошибке?

Взгляните на третий раздел этой статьи о рефакторинге компонентов реакции на классы es6.

При использовании React.createClass({componentObjectLiteral}) синтаксис, React привязывает ваши методы объекта к экземпляру компонента, так что когда ваш _onChange метод вызывается как ваш вход onChange функция обратного вызова, this ключевое слово в вашем _onChange Метод привязан к вашему компоненту.

React не привязывает ваши методы автоматически, поэтому вы должны сделать это сами. Измените свой JSX на onChange={this._onChange.bind(this)}

psigns это правильно React.createClass() автоматически связывает методы с экземпляром компонента для вас. Это не тот случай, когда вы используете class синтаксис в React.

Но есть очень хорошая возможность, когда вы объединяете инициализаторы свойств с функциями стрелок:

class SearchBox extends React.Component {

  // …

 _onChange = (event, value) => {
    // …

    // this will be bound to component
    this.setState({text: event.target.value}); 
  }

  // …

}

Затем вы можете использовать метод, который вы использовали ранее в части jsx:

onChange={this._onChange}  // without .bind(this)

Я узнал об этом, прочитав отличный пост Стивена Люшера.

Другие вопросы по тегам