useInterval

useInterval的实现

场景:

  1. 登录互踢:已登录的情况下,需要长轮询,定时检测当前用户是否被登出
  2. 动画的场景下:定时重复
    原理:利用了useEffect,所有直接使用,不用考虑要清除定时器,用法和setInterval一致

方法:

  1. 暂停,开启,,传入一个总的执行次数
  2. 可以随时调整里面的变化的值,也就是调整进度

具体实现逻辑:

import React, { useState, useEffect, useRef } from "react";
import ReactDOM from "react-dom";

function Counter() {
  const [count, setCount] = useState(0);
  const [delay, setDelay] = useState(1000);
  const [isRunning, setIsRunning] = useState(true);
  useInterval(() => {
    setCount(count + 1);
  }, isRunning ? delay : null);

  function handleDelayChange(e) {
    setDelay(Number(e.target.value));
  }

  function handleIsRunningChange(e) {
    setIsRunning(e.target.checked);
  }

  return (
    <>
      <h1>{count}</h1>
      <input type="checkbox" checked={isRunning} onChange={handleIsRunningChange} /> Running
      <br />
      <input value={delay} onChange={handleDelayChange} />
    </>
  );
}

function useInterval(callback, delay) {
  const savedCallback = useRef();

  // Remember the latest function.
  useEffect(() => {
    savedCallback.current = callback;
  }, [callback]);

  // Set up the interval.
  useEffect(() => {
    function tick() {
      savedCallback.current();
    }
    if (delay !== null) {
      let id = setInterval(tick, delay);
      return () => clearInterval(id);
    }
  }, [delay]);
}

const rootElement = document.getElementById("root");
ReactDOM.render(<Counter />, rootElement);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天是什么日子:自律操作系统建设的第187天! 12条军规铁律!:1.不发不写任何朋友圈,朋友圈只用来打卡!不刷朋...
    辽远的边疆阅读 126评论 0 1
  • ziwo 1 自我负责:我发现了卡点,尝试去陪伴那个场景的我。 2 创造资源:我尝试用自我关怀的方法去帮助她。或者...
    254e033d307b阅读 106评论 0 0
  • 十七、AJAX & JSON AJAX = Asynchronous JavaScript and XML(异步的...
    默默_01cf阅读 250评论 0 0
  • Html5 语义化标签 headerfooternavarticlesection 文档类型定义 在h5中只需要写...
    路人丁0417阅读 1,134评论 0 2
  • VNC远程桌面配置 跨平台远程桌面工具安装 VNC server下载 https://www.realvnc.co...
    Mr_Nobody阅读 481评论 0 1