Я пытаюсь обернуть голову вокруг синтаксиса для классов в ES6. В то же время обучение Ткань уроженец через Бонни Эйзенмана Изучение Реагирующей Нации.
Я столкнулся с проблемой доступа к this
в обратном вызове, когда этот обратный вызов является методом класса. Я знаю, что проблемы вокруг lexical this
в обратных вызовах многократно возникали в StackOverflow. Например, в
Как получить доступ к правильному контексту` this` внутри обратного вызова?.
Основываясь на моем исследовании онлайн, я нашел решение. Но я не уверен, что это правильный способ сделать это в ES6.
Моя проблема возникла, когда я попробовал следующее:
class WeatherProject extends Component {
constructor(props) {
super(props);
this.state = {
zip: ''
};
}
_handleTextChange(event) {
console.log(event.nativeEvent.text);
this.setState({zip: event.nativeEvent.text})
}
render() {
return (
<TextInput
style={styles.input}
onSubmitEditing={this._handleTextChange}/>
);
}
}
(Которое я только немного изменил из примера в книге, чтобы соответствовать синтаксису класса ES6 и синтаксису import/export вместо Require.)
Если я это сделаю, this
в _handleTextChange
будет undefined (не может прочитать свойство 'setState' из undefined). Я был удивлен этим. Исходя из других языков OO, я интерпретирую, как будто этот метод ведет себя больше, как если бы это был статический метод.
Я смог решить это, пропустив метод класса и используя обозначение стрелки. onSubmitEditing={event => this.setState({name: event.nativeEvent.text})}
. Что хорошо работает. У меня нет проблем или смущения.
Я действительно хочу разобраться, как вызвать метод класса. После честного исследования мне удалось сделать это, выполнив следующие действия: onSubmitEditing={this._handleTextChange.bind(this)}
. Возможно, я неправильно понял фундаментальный аспект JavaScript (я новичок в JS), но для меня это кажется совершенно безумным. Нет ли способа доступа к контексту объекта из одного метода без явной привязки объекта обратно к... его собственному методу в том месте, где он вызывается?
Я также попытался добавить var self = this;
в конструктор и вызвать self.setState
в _handleTextChange
. Но не удивился, обнаружив, что это не сработало.
Каков правильный способ доступа к объекту из одного из его методов, когда он вызывается как обратный вызов?