I am a newbie to React.js and I am trying hard to understand several methods in the React lifecycle methods.
So far, I have something that confuses me:
1)
As far as I understand, the difference between componentWillUpdate
and componentWillReceiveProps
is that componentWillReceiveProps
will be called when the parent changes the props and we can use setState (setState of this child inside componentWillReceiveProps
).
for example: react-table-sorter-demo
var App = React.createClass({
getInitialState: function() {
return {source: {limit: "200", source: "source1"}};
},
handleSourceChange: function(source) {
this.setState({source: source});
},
render: function() {
return (
<div>
<DataSourceSelectors onSourceChange={this.handleSourceChange} source={this.state.source} />
<TableSorter dataSource={urlForDataSource(this.state.source)} config={CONFIG} headerRepeat="5" />
</div>
);
}
});
In TableSorter, we have
componentWillReceiveProps: function(nextProps) {
// Load new data when the dataSource property changes.
if (nextProps.dataSource != this.props.dataSource) {
this.loadData(nextProps.dataSource);
}
}
meaning when we change this.state.source
, we will expect componentWillReceiveProps
to be called in TableSorter.
However, I don't quite understand how to use componentWillUpdate
in this case, the definition of componentWillUpdate
is
componentWillUpdate(object nextProps, object nextState)
How can we pass nextState from parent into child? Or maybe I am wrong, is the nextState passed from the parent element?
2)
method componentWillMount
confuses me because in the official documentation, it says that
Invoked once, both on the client and server, immediately before the initial rendering occurs.
In this case, if I use setState in this method, it will override the getInitialState since it will be called once only initially. In this case, what is the reason to set the parameters in the getInitialState method. In this particular case, we have:
getInitialState: function() {
return {
items: this.props.initialItems || [],
sort: this.props.config.sort || { column: "", order: "" },
columns: this.props.config.columns
};
},
componentWillMount: function() {
this.loadData(this.props.dataSource);
},
loadData: function(dataSource) {
if (!dataSource) return;
$.get(dataSource).done(function(data) {
console.log("Received data");
this.setState({items: data});
}.bind(this)).fail(function(error, a, b) {
console.log("Error loading JSON");
});
},
items will be overriddene initially and why do we still need
items: this.props.initialItems || []
in the getInitialState method?
Hope you can understand my explanation, and please give me some hints if you have any.