反应生命周期方法的理解
我是React.js的新手,我正在努力理解反应生命周期方法中的几个方法。
到目前为止,我还是有一些让我困惑的东西:
1)
据我了解, componentWillUpdate
和componentWillReceiveProps
之间的区别是,当父母更换道具时, componentWillReceiveProps
将被调用,我们可以在componentWillReceiveProps
使用setState(setState)。
例如: https : //github.com/bgerm/react-table-sorter-demo/blob/master/jsx/app.jsx
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> ); } });
在TableSorter中,我们有
componentWillReceiveProps: function(nextProps) { // Load new data when the dataSource property changes. if (nextProps.dataSource != this.props.dataSource) { this.loadData(nextProps.dataSource); } }
意思是当我们改变this.state.source
,我们会期望在TableSorter中调用componentWillReceiveProps
但是,在这种情况下,我不太了解如何使用componentWillUpdate
, componentWillUpdate
的定义是
componentWillUpdate(object nextProps, object nextState)
我们怎样才能把下一个从父母的状态转化为孩子? 或者,也许我错了,是从父元素传递的nextState?
2)方法componentWillMount
迷惑我,因为在官方文档中,它说
在初始渲染发生之前立即在客户端和服务器上调用一次。
在这种情况下,如果在此方法中使用setState,则它将覆盖getInitialState,因为它只会在初始时调用一次。 在这种情况下,在getInitialState方法中设置参数的原因是什么。 在这个特殊的情况下,我们有
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: this.props.initialItems || []
items: this.props.initialItems || []
int items: this.props.initialItems || []
getInitialState方法?
希望你能理解我的解释,如果你有任何问题,请给我一些提示。 非常感谢:)
1)在React更新生命周期中的componentWillUpdate
之前调用componentWillUpdate
。 你正确的是componentWillReceiveProps
允许你调用setState
。 另一方面, componentWillUpdate
是您需要响应状态更改时使用的callback。
道具和国家之间的根本区别在于,国家对这个组成部分是私人的。 这就是为什么父组件或其他任何人都不能操纵组件的状态(例如call setState
)。 因此,父子组件关系的默认工作stream将如下所示:
- 父母将新的道具传递给孩子
- Child在“componentWillReceiveProps”中处理新的道具,必要时调用
setState
- Child在'componentWillUpdate'中处理新的状态 – 但是如果你的组件是有状态的,那么在'componentWillReceiveProps'中处理道具就足够了。
2)你提供了一个很好的代码示例来说明不同之处。 在getInitialState
设置的默认值将用于初始渲染。 来自componentWillMount
的loadData
调用将启动一个AJAX请求,这个请求可能成功也可能不会成功,而且不知道需要多长时间才能完成。 当AJAX请求完成并且setState
以新状态被调用时,组件将以默认值被呈现在DOM中。 这就是为什么在getInitialState
提供默认状态的原因。
注意:我发现了解React组件生命周期文章对理解React的生命周期方法有很大的帮助。
最好的文章我曾经阅读了解React组件的生命周期:
了解React组件生命周期