使用 clearInterval() 取消定时器,可以在组件卸载时清除定时器。示例如下:
import React, { Component } from 'react';
class Example extends Component {
state = {
someValue: 0,
}
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
componentWillUnmount() {
clearInterval(this.timerID);
}
tick() {
this.setState({
someValue: this.state.someValue + 1
});
}
render() {
return (
{this.state.someValue}
);
}
}
export default Example;
useRef 是一个 hook,它返回一个可以在各个渲染周期共享的对象。使用它来存储定时器的 ID,以便在 unmount 时清除定时器。示例如下:
import React, { useState, useRef, useEffect } from 'react';
const Example = () => {
const [someValue, setSomeValue] = useState(0);
const timerID = useRef(null);
useEffect(() => {
timerID.current = setInterval(() => {
setSomeValue(someValue => someValue + 1);
}, 1000);
return () => clearInterval(timerID.current);
}, []);
return {someValue};
};
export default Example;
以上两种方法可以避免因为状态变化导致的 timer 触发问题,同时也可以解决组件 unmount 后定时器未及时关闭导致的问题。