我最近在React.js中编写了组件。我从未使用componentWillMount
和componentDidMount
等方法。
render
是不可或缺的。我写的getInitialState
和其他辅助方法也派上用场了。但不是上述两种生命周期方法。
我目前的猜测是它们用于调试?我可以在其中调用console.log:
componentWillMount: function() {
console.log('component currently mounting');
},
componentDidMount: function() {
console.log('component has mounted');
}
还有其他用途吗?
答案 0 :(得分:25)
componentDidMount
非常有用。例如,React中缺少一个好的日期选择器。 Pickaday很漂亮,开箱即用。所以我的DateRangeInput组件现在使用Pickaday作为开始和结束日期输入,我把它连接起来:
componentDidMount: function() {
new Pikaday({
field: React.findDOMNode(this.refs.start),
format: 'MM/DD/YYYY',
onSelect: this.onChangeStart
});
new Pikaday({
field: React.findDOMNode(this.refs.end),
format: 'MM/DD/YYYY',
onSelect: this.onChangeEnd
});
},
需要为Pikaday呈现DOM以连接它,componentDidMount
钩子可以让你挂钩到那个确切的事件。
componentWillMount
非常有用。我正在研究的一个代码库中的一个例子是mixin,它有一堆代码,否则这些代码将被复制到许多不同的菜单组件中。 componentWillMount
用于设置一个特定共享属性的状态。可以使用componentWillMount
的另一种方法是通过prop(s)设置组件分支的行为:
componentWillMount() {
let mode;
if (this.props.age > 70) {
mode = 'old';
} else if (this.props.age < 18) {
mode = 'young';
} else {
mode = 'middle';
}
this.setState({ mode });
}
答案 1 :(得分:4)
componentDidMount
只在客户端运行一次。这很重要,特别是如果您正在编写同构应用程序(在客户端和服务器上运行)。您可以使用componentDidMount执行要求您有权访问窗口或DOM的任务。
来自Facebook的React Page
If you want to integrate with other JavaScript frameworks, set timers using setTimeout or setInterval, or send AJAX requests, perform those operations in this method.
componentWillMount
用例较少(我并没有真正使用它),但它的不同之处在于它在客户端和服务器端运行。您可能不希望在此处放置事件侦听器或DOM操作,因为它会尝试在服务器上无缘无故地运行。
答案 2 :(得分:0)
这是使用componentWillMount
的同构Web应用程序示例:https://github.com/coodoo/react-redux-isomorphic-example
但是,我99%肯定它在服务器端没有任何理由运行componentWillMount
内的代码(我认为使用componentDidMount
确保它只运行客户端会产生更多感觉)作为确保在呈现页面之前满足获取承诺的代码在server.js中不在单个组件内。
在这里讨论了每个组件的异步提取:https://github.com/facebook/react/issues/1739据我所知,就同构至少而言,componentWillMount
没有一个好的用例。
答案 3 :(得分:0)
在我的项目中,这是一个仪表板工具,我使用了componentDidMount()。
在主页上,以前保存的仪表板显示在侧栏上。我在组件呈现主页的componentDidMount()中进行了ajax调用,以便在呈现页面后异步获取仪表板列表。
答案 4 :(得分:-2)
为什么要反应生命周期方法?
打算将第三方(Ex D3.js)库与React Component
一起使用class Example extends React.component{
constructor(){
// init state
// will be called only once
}
componentWillMount(){
// will be called only once
// will not be triggered when re-rendering
// usually will fetch data that is needed in order
// to render properly from other API
}
shouldComponentUpdate(){
return false
// will not re-render itself after componentDidMount(){}
}
render(){
return (
<div id="chart"></div>
)
}
componentDidMount(){
d3.select(".chart")
.selectAll("p")
// d3.js ........
// d3.js ........
// Usually, this will trigger React to re-render itself,
// but this time will not because we have set
// shouldComponentUpdate to false
}
}
为什么React想要这样做?
由于渲染DOM是一项昂贵的操作,因此React使用虚拟DOM层来仅更新与先前状态不同的DOM / DOM。