React生命周期相关的方法

Seven 2022-01-27 10:23:01
Categories: > Tags:

REACT介绍文档第5节,讲了一些组件生命周期的函数,包括:componentDidMount()、componentWillUnmount(),第3节还介绍了render()、setState(),这些都是预定义函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Clock extends React.Component {
constructor(props) {
super(props);
this.state = {date: new Date()};
}

componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}

componentWillUnmount() {
clearInterval(this.timerID);
}

tick() {
this.setState({
date: new Date()
});
}

render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
}

ReactDOM.render(
<Clock />,
document.getElementById('root')
);

tick()是自定义函数,constructor()是构造函数。

让我们来快速概括一下发生了什么和这些方法的调用顺序:

调用顺序也比较好理解,首先ReactDOM.render()调用Clock的构造函数constructor(),然后REACT调用Clock的render()函数,进入生命周期后先调用 ComponentDidMount(),这里遇到了个问题,ComponentDidMount()中的setInterval()是怎么做到每隔1秒调用一次 tick() 的?

实际上这个问题已经不在REACT范畴了,setInterval()属于HTML DOM方法,setInterval()函数本身只执行一次,setInterval()内部会设置计划每秒执行 tick(),具体细节这里不必关心。setInterval()函数的返回值是一个数字,这个数字可以传递给 Window.clearInterval() 从而取消对 code 的周期性执行的值。而this.timerID = setInterval()仅仅是把定时器函数返回的数值保存在Clock实例的某个属性中,等待Clock组件生命周期结束时,调用componentWillUnmount() 中的clearInterval()时,将标识定时器的数值传入,来终止这个定时器。timerID不是预定义属性,可以改成其他名称,比如timer1。第一次看我有点糊涂,以为是REACT通过this.timerID不停的调用setInterval()函数,实际上setInterval()执行后,定时器就自动开始每1秒执行一次了。

而本文的重点是setState()函数,这是REACT的预定义函数,当调用这个函数时,REACT就知道状态改变了,就会在setState()函数执行后,自行调用render() 方法重新渲染页面。