react 设置定时器

本文详细介绍了如何使用React创建一个实时显示当前时间的时钟组件。包括组件的状态管理、生命周期钩子函数的应用以及如何实现定时更新组件显示的时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE html>
<html>
  <head>
    <script src="../build/react.js"></script>
    <script src="../build/react-dom.js"></script>
    <script src="../build/browser.min.js"></script>
  </head>
  <body>
    <div id="div1"></div>
    <script type="text/babel">
    var HelloMessage = React.createClass({
      getInitialState:function()
      {
       return   {    h:0,  m:0,  s:0   }
      },
      componentDidMount:function(){

            var _this=this;
       setInterval(function(){

      _this.handleClick();

     },1000)},

      handleClick: function() {
              var time=new Date();
              this.setState(
                {
                  h:time.getHours(),
                  m:time.getMinutes(),
                  s:time.getSeconds()
                }
              )

          },
      render: function() {
        return <div>
        <span>{this.state.h}:</span>
        <span>{this.state.m}:</span>
         <span>{this.state.s}</span>
        </div>;
      }
    });

ReactDOM.render(
<HelloMessage  />,
  document.getElementById('div1'));
</script>

  </body>
</html>

操作步骤:
1. getInitialState 初始化变量 h,m,s
2. handleClick 用函数来处理 this.setState () h,m, s
3. 将this.state.h,ms给render做渲染
4. componentDidMount

我们来快速回顾一下该过程,以及调用方法的顺序:

  1. 当 < HelloMessage /> 被传入 ReactDOM.render() 时, React 会调用 getInitialState函数。 因为 HelloMessage 要显示的是当前时间,所以它将使用包含当前时间的对象来初始化 this.state 。我们稍后会更新此状态。
  2. 然后 React 调用了 HelloMessage 组件的 render() 方法。 React 从该方法返回内容中得到要显示在屏幕上的内容。然后,React 然后更新 DOM 以匹配 HelloMessage 的渲染输出。
  3. 当 HelloMessage 输出被插入到 DOM 中时,React 调用 componentDidMount() 生命周期钩子。在该方法中,HelloMessage 组件请求浏览器设置一个定时器来一次调用 handleClick()。
  4. 浏览器会每隔一秒调用一次 handleClick()方法。在该方法中, Clock 组件通过 setState() 方法并传递一个包含当前时间的对象来安排一个 UI 的更新。通过 setState(), React 得知了组件 state(状态)的变化, 随即再次调用 render() 方法,获取了当前应该显示的内容。 这次,render() 方法中的 this.state.date 的值已经发生了改变, 从而,其输出的内容也随之改变。React 于是据此对 DOM 进行更新。

这里写代码片

组件的生命周期分成三个状态:

名称解释
Mounting已插入真实 DOM
Updating正在被重新渲染
Unmounting已移出真实 DOM

React 为每个状态都提供了两种处理函数,will 函数在进入状态之前调用,did 函数在进入状态之后调用,三种状态共计五种处理函数。

名称解释
componentWillMount()创建之前
componentDidMount()创建之后
componentWillUpdate(object nextProps, object nextState)更新之前
componentDidUpdate(object nextProps, object nextState)更新之后
componentWillUnmount()卸载之后

此外,React 还提供两种特殊状态的处理函数。

名称解释
componentWillReceiveProps(object nextProps)已加载组件收到新的参数时调用
shouldComponentUpdate(object nextProps, object nextState)组件判断是否重新渲染时调用
### 如何在 React 中正确使用 `setInterval` 定时器 #### 类组件中的定时器实现 为了确保定时器能够正常工作并及时清理,在类组件中应当利用生命周期方法来管理定时器。具体来说,`componentDidMount` 方法用于初始化定时器,而 `componentWillUnmount` 则负责清除定时器以防止内存泄漏。 ```javascript class Timer extends React.Component { constructor(props) { super(props); this.state = { seconds: 0 }; } componentDidMount() { this.interval = setInterval(() => { this.setState((prevState) => ({ seconds: prevState.seconds + 1 })); }, 1000); } componentWillUnmount() { clearInterval(this.interval); } render() { return ( <div> Seconds: {this.state.seconds} </div> ); } } ``` 上述代码展示了如何创建一个每秒增加计数的简单计时器[^2]。 #### 函数组件与 Hooks 的组合使用 对于现代 React 开发而言,更推荐采用基于 Hook 的方式处理逻辑复杂的场景。这里介绍一种常见的做法—通过 `useEffect` 和 `useState` 来替代传统的生命周期钩子: ```jsx import React, { useState, useEffect } from 'react'; function TimerHook() { const [seconds, setSeconds] = useState(0); useEffect(() => { let intervalId; function tick() { setSeconds(prevSeconds => prevSeconds + 1); } intervalId = setInterval(tick, 1000); // 清理操作会在卸载组件或依赖项变化时触发 return () => clearInterval(intervalId); }, []); // 空数组表示仅当首次渲染时运行此副作用 return ( <div>Seconds (using hooks): {seconds}</div> ); } export default TimerHook; ``` 这段代码实现了相同的功能,但是采用了更加简洁的方式,并且更好地遵循了函数式的编程风格。 #### 防止重复挂载引起的错误 需要注意的是,如果不小心多次挂载同一个组件,则可能导致多个定时器实例同时存在,进而引发意想不到的行为。因此建议始终检查是否存在未被销毁的老化定时器实例,并采取适当措施加以防范[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值