当你切换到另一个标签时倒计时会暂停,当你返回到当前标签时倒计时会再次执行

import { useEffect, useRef, useState } from "react";

function Timepiece() {
  let [count, setCount] = useState(30);
  let timer = useRef(null);

  function countDown() {
    if (timer.current) {
      clearInterval(timer.current);
    }
    timer.current = setInterval(() => {
      count -= 1;
      setCount(count);
      if (count <= 0) {
        setCount(0);
        clearInterval(timer.current);
      }
      console.log("[]", count);
    }, 1000);
  }

  let hidden, visibilityChange;
  if (typeof document.hidden !== "undefined") {
    hidden = "hidden";
    visibilityChange = "visibilitychange";
  } else if (typeof document.msHidden !== "undefined") {
    hidden = "msHidden";
    visibilityChange = "msvisibilitychange";
  } else if (typeof document.webkitHidden !== "undefined") {
    hidden = "webkitHidden";
    visibilityChange = "webkitvisibilitychange";
  }

  //当你切换到另一个标签时倒计时会暂停,当你返回到当前标签时倒计时会再次执行
  function visibilitychangeEvent() {
    console.log("[]", document[hidden]);
    if (document[hidden]) {
      clearInterval(timer.current);
    } else {
      countDown();
    }
  }

  useEffect(() => {
    console.log("[Community]");
    countDown();
    document.addEventListener(visibilityChange, visibilitychangeEvent);

    return () => {
      console.log("[清除函数]");
      clearInterval(timer.current);
      document.removeEventListener(visibilityChange, visibilitychangeEvent);
    };
  }, []); // eslint-disable-line

  return (
    <>
      <div>倒计时:{count}</div>
    </>
  );
}

export default Timepiece;

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐