Instance v state variables in react.js
JavascriptReactjsJavascript Problem Overview
In react.js, is it better to store a timeout reference as an instance variable (this.timeout) or a state variable (this.state.timeout)?
React.createClass({
handleEnter: function () {
// Open a new one after a delay
var self = this;
this.timeout = setTimeout(function () {
self.openWidget();
}, DELAY);
},
handleLeave: function () {
// Clear the timeout for opening the widget
clearTimeout(this.timeout);
}
...
})
or
React.createClass({
handleEnter: function () {
// Open a new one after a delay
var self = this;
this.state.timeout = setTimeout(function () {
self.openWidget();
}, DELAY);
},
handleLeave: function () {
// Clear the timeout for opening the widget
clearTimeout(this.state.timeout);
}
...
})
both of these approaches work. I just want to know the reasons for using one over the other.
Javascript Solutions
Solution 1 - Javascript
I suggest storing it on the instance but not in its state
. Whenever state
is updated (which should only be done by setState
as suggested in a comment), React calls render
and makes any necessary changes to the real DOM.
Because the value of timeout
has no effect on the rendering of your component, it shouldn't live in state
. Putting it there would cause unnecessary calls to render
.
Solution 2 - Javascript
In addition to what @ssorallen said, you should also remember to handle the component unmounting before your handleLeave is called.
React.createClass({
handleEnter: function () {
// Open a new one after a delay
this._timeout = setTimeout(function () {
this.openWidget();
}.bind(this), DELAY);
},
handleLeave: function () {
// Clear the timeout for opening the widget
clearTimeout(this._timeout);
},
componentWillUnmount: function(){
// Clear the timeout when the component unmounts
clearTimeout(this._timeout);
},
...
});