I'm trying to wrap my head around the syntax for Classes in ES6. While at the same time learning Fabric native through Bonnie Eisenman's Learning React Native.
I've come accross an issue around accessing this
in a callback, when that callback is a Class "method". I'm aware issues around lexical this
in callbacks have been raised many times on StackOverflow. For instance in
How to access the correct `this` context inside a callback?.
Based on my research online I've come across a solution. But I am not sure this is the correct way to do it in ES6.
My issue came about when I tried the following below:
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}/>
);
}
}
(Which I've only slightly modified from the example in the book to match the ES6 class syntax and the import/export syntax instead of Require.)
If I do this, the this
in _handleTextChange
is undefined (cannot read property 'setState' of undefined). I was surprised by this. Coming from other OO languages, I'm interpreting as though this method is behaving more as if it was a static method.
I've been able to solve this by skipping the class method and using the arrow notation. onSubmitEditing={event => this.setState({name: event.nativeEvent.text})}
. Which works fine. I have no problems or confusion with that.
I really want to work out how to call a class method though. After a fair bit of research I've managed to make it work by doing the following: onSubmitEditing={this._handleTextChange.bind(this)}
. Perhaps I've misunderstood a fundamental aspect of JavaScript (I'm a beginner in JS), but this seems completely insane to me. Is there really no way of accessing the context of an object from within a method without explicitly binding the object back onto... it's own method, at the point where it is called?
I've also tried adding var self = this;
in the constructor and calling self.setState
in _handleTextChange
. But wasn't too surprised to find that didn't work.
What's the correct way of accessing an object from within one of its methods when it is called as a callback?