react-hooks 中 setInterval 的使用

我打算实现一个显示当前时间的组件,于是用到了setInterval

import moment from 'moment';
import React, { useEffect, useState } from 'react';

const ShowCurrentTime = ()=>{
  const formatting = 'YYYY年MM月DD日 HH:mm:ss'; // 格式化时间
  const [currentTime, setTime] = useState(moment().format(formatting));
  const showCurrentTime =()=>setTime(() => moment().format(formatting));
  const delay=1000;
  useEffect(() => {
    if(delay !== null){
      const timer:NodeJS.Timeout = setInterval(() => {showCurrentTime()}, delay);
      return () => {
        if (timer) {
          clearInterval(timer); // 取消定时器;
        }
      }
    }
    return ()=>{}
  },[delay]);

  return <div>{currentTime}</div>;
};
export default ShowCurrentTime

上面的代码组件正常运行,但是有一点美中不足的是useEffct中写了定时器和业务代码,实际上可以进行一下抽离优化。把定时器抽离出来

import moment from 'moment';
import React, { useState } from 'react';

const useInterval=(callback:()=>void,delay:number)=>{
  const saveCallback = useRef(callback);
  useEffect(() => {
    saveCallback.current = callback;
  }, [callback]);
  useEffect(() => {
    if(delay !== null){
      const timer:NodeJS.Timeout = setInterval(() => saveCallback.current(), delay);
      return () => {
        if (timer) {
          clearInterval(timer); // 取消定时器;
        }
      }
    }
    return ()=>{}
  },[delay]);
};

const ShowCurrentTime = ()=>{
  const formatting = 'YYYY年MM月DD日 HH:mm:ss'; // 格式化时间
  const [currentTime, setTime] = useState(moment().format(formatting));
  const showCurrentTime =()=>setTime(() => moment().format(formatting));
  useInterval(showCurrentTime,1000);
  return <div>{currentTime}</div>;
};
export default ShowCurrentTime

嗯,这样就舒服很多!

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容