The componentDidMount() hook runs after the component output has been rendered to the DOM.
根据官方Doc说"组件输出到 DOM 后会执行 componentDidMount() 钩子", 我打了两个log输出, 结果如下:
>>>render
>>>componentDidMount
>>>render
>>>render
>>>render
>>>render
# 等等
问:
componentDidMount的准确回调时机是什么呢? 由setState()引起的render和首次render的行为是不是有差别?
如果把
setInterval(() => this.tick(),1000);
移到render里, 会发生"跳数"的效果.
求前辈指点~
Code:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
class Clock extends React.Component {
constructor() {
super();
this.state = {date: new Date()};
}
componentDidMount() {
this.log = loglog("componentDidMount");
this.timer = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timer);
}
tick() {
this.setState({
date: new Date()
});
}
render() {
loglog('render');
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}
ReactDOM.render(
<Clock />,
document.getElementById('root')
);
function loglog(sth) {
console.log('>>>' + sth);
}
回答你的问题1:首次render是在componentWillMount之后,可以这样描述componentWillMount-->render-->componentDidMount,再来说setState(),setState()是改变组件中的state,组件中的state一旦改变,组件就会自动更新,它不是生命周期,还有一点楼上说过了就是componentDidMount只会组件挂载完成后,加载一次。
回答你的问题2:react中不可以在render里面改变state的值,你在render中调用了tick()函数,里面存在setstate()方法,这是不对的。