在 React 组件中使用 setInterval

IT技术 javascript reactjs
2021-03-25 14:19:12

我正在阅读官方 react 网站上的教程。在生命周期方法的例子中,在componentDidMount方法下,setInterval函数设置了timerID。

我的问题是,即使 timerID 已初始化,但从未在整个应用程序中调用过,应用程序如何在不显式调用应用程序中任何地方的 timerID 的情况下工作。这是下面的代码。

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')

);
3个回答

this.timerID是一个数字非零值,用于标识调用创建的计时器setInterval()可以传递此值clearInterval以清除计时器。

所以当在 componentDidMount 中调用 setInterval 时

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

您想在组件安装后执行该tick()功能every 1 sec a现在,当您导航到另一个组件并且当前组件已卸载时,如果您不清除tick()函数的间隔调用,它将继续执行。

因此,在componentWillUnmount您的计时器被清除函数中,setInterval它由存储在this.timerID

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

所以 React 文档中提供的完整代码是

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')
);

这很简单。一旦 React 执行componentDidMount()生命周期方法,计时器就会开始运行。

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

上述计时器将一直运行,直到组件被卸载(根据您的代码)。您的代码以这种方式工作并不奇怪。

在这个react文档中,它写道

我们将在 componentWillUnmount() 生命周期方法中拆除计时器

因此,this.timerID将在componentWillUnmount()生命周期方法中用于停止计时器。