react新特性hooks封装组件清除setInterval定时器

来源:程序思维浏览:8021次
今天我用hooks封装轮播图组件,发现清除不了setInterval定时器,这个坑如何填?来看看我是怎么解决的吧?



首先先看一下我的组件代码:

import React, {useState, useEffect, useCallback, useRef} from 'react';
import PropTypes from 'prop-types';
import "./style.css";
function Swiper(props){
    const [data,setData]=useState([]);
    const [isInit,setIsInit]=useState(true);
    const [iIndex,setIndex]=useState(0);
    //创建一个标识,通用容器
    const timer=useRef(null);
    //点击切换图片
    function changeImg(index){
        setIndex(index);
        if(data && data.length>0){
            for(let i=0;i<data.length;i++){
                if(data[i].active){
                    data[i].active=false;
                    break;
                }
            }
            data[index].active=true;
            //深拷贝解决引用问题
            setData(JSON.parse(JSON.stringify(data)));
        }
    }
    //自动播放
    const autoPlay=useCallback(()=>{
        let tmpIndex=iIndex;
        clearInterval(timer.current);
        timer.current=setInterval(()=>{
            if(data && data.length>0){
                for(let i=0;i<data.length;i++){
                    if(data[i].active){
                        data[i].active=false;
                        break;
                    }
                }
                if(tmpIndex>=data.length-1){
                    tmpIndex=0;
                }else {
                    tmpIndex++;
                }
                setIndex(tmpIndex);
                data[tmpIndex].active=true;
                setData(JSON.parse(JSON.stringify(data)));
            }
        },3000)
    },[data,iIndex]);
    //暂停播放
    function stop(){
        clearInterval(timer.current);
    }
    useEffect(()=>{
        if(props.data && props.data.length>0 && isInit){
            setIsInit(false);
            for(let i=0;i<props.data.length;i++){
                if(i===0){
                    props.data[i].active=true;
                }else{
                    props.data[i].active=false;
                }
            }
            setData(props.data);
        }
        autoPlay();
  //页面离开时清除定时器
        return ()=>{
            clearInterval(timer.current);
        }
    },[props.data,autoPlay,isInit]);
    return(
        <div className="my-swiper-main" onMouseOver={stop} onMouseOut={autoPlay}>
            {
                (data && data.length>0) && data.map((item,index)=>{
                    return (
                        <div className={item.active?"slide show":"slide"} key={index}>
                            <a href={item.url} target="_blank" rel="noopener noreferrer"><img src={item.src} alt=""/></a>
                        </div>
                    )
                })
            }
            <div className="pagination">
                {
                    (data && data.length>0) && data.map((item,index)=>{
                        return (
                            <div className={item.active?"dot active":"dot"} key={index} onClick={changeImg.bind(this,index)}></div>
                        )
                    })
                }
            </div>
        </div>
    )
}
export default Swiper;
//检查数据类型
Swiper.propTypes={
    data:PropTypes.array.isRequired
};

上面的代码有一个useRef用这个来创建一个标识let timer=useRef(null),里面有一个current将setInterval付给这个变量即可,清除的时候clearInterval(timer.current),这个就可以清除定时器了。
精品好课
React实战视频教程仿京东移动端电商
React是前端最火的框架之一,就业薪资很高,本课程教您如何快速学会React并应用到实战,对正在工作当中或打算学习React高薪就业的你来说,那么这门课程便是你手中的葵花宝典。
jQuery视频教程从入门到精通
jquery视频教程从入门到精通,课程主要包含:jquery选择器、jquery事件、jquery文档操作、动画、Ajax、jquery插件的制作、jquery下拉无限加载插件的制作等等......
VUE2+VUE3视频教程从入门到精通(全网最全的Vue课程)
VUE是目前最火的前端框架之一,就业薪资很高,本课程教您如何快速学会VUE+ES6并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习VUE高薪就...
最新完整React视频教程从入门到精通纯干货纯实战
React是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习React高薪就...
HTML5基础入门视频教程易学必会
HTML5基础入门视频教程,教学思路清晰,简单易学必会。适合人群:创业者,只要会打字,对互联网编程感兴趣都可以学。课程概述:该课程主要讲解HTML(学习HTML5的必备基础语言)、CSS3、Javascript(学习...
最新完整React+VUE视频教程从入门到精,企业级实战项目
React和VUE是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React和VUE并应用到实战,教你如何解决内存泄漏,常用库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习Re...
HTML5视频播放器video开发教程
适用人群1、有html基础2、有css基础3、有javascript基础课程概述手把手教你如何开发属于自己的HTML5视频播放器,利用mp4转成m3u8格式的视频,并在移动端和PC端进行播放支持m3u8直播格式,兼容...
Vue2+Vue3+ES6+TS+Uni-app开发微信小程序从入门到实战视频教程
2021年最新Vue2+Vue3+ES6+TypeScript和uni-app开发微信小程序从入门到实战视频教程,本课程教你如何快速学会VUE和uni-app并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己...
收藏
扫一扫关注我们