使用 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 后定时器未及时关闭导致的问题。