似乎触发了useEffect,即使依赖状态未改变?
P粉946336138
P粉946336138 2023-08-15 16:21:30
[React讨论组]

我正在尝试在我的React项目中构建一个轮播组件 - 实际上,我试图利用一个用纯JS编写的现有轮播组件,使用Refs在React中使其工作,而不是直接修改DOM。当我尝试通过将序列中的第一张幻灯片标记为当前幻灯片(具有className current-slide)来初始化轮播时,我遇到了问题。我将此操作放在了一个useEffect钩子中,其中{topMovies}是依赖项。{topMovies}是一个通过prop传递给轮播组件的对象数组,因此当topMovies发生变化(即加载)时,useEffect应该运行。这个操作是有效的 - 加载后,轮播中的第一张幻灯片被赋予了classname 'current-slide'。

然而,第二段代码(nextSlide和moveToSlide)是选择下一张幻灯片的函数的开始。将track Ref(即所有幻灯片的容器)传递给函数,以便可以选择具有className 'current-slide'的子元素,并删除其className。这也是有效的 - 但是在短暂的延迟(约1秒)后,className 'current-slide'重新出现。

const Carouselv2 = ({topMovies}) => {

    //Refs

    const trackRef = useRef();
    const nextBtnRef = useRef();
    const prevBtnRef = useRef();
    const navDotsRef = useRef();

    //Initialise carousel upon prop load

    const [isLoading, setIsLoading] = useState(true);

    useEffect(() => {
        if (topMovies && setIsLoading) {
            const slides = Array.from(trackRef.current.children);

            slides[0].classList.add('current-slide'); //Mark first slide as visible

            const slideWidth = slides[0].getBoundingClientRect().width;

            const setSlidePosition = (slide, index) => {
                slide.style.left = slideWidth * index + 'px';
            }

            slides.forEach(setSlidePosition); //Arrange slides alongside each other

            setIsLoading(false);
        }
    }, [topMovies]);

    //Button functionality

    const moveToSlide = (currentSlide, targetSlide) => {
        //trackRef.current.style.transform = 'translateX(-' + targetSlide.style.left + ')';
        currentSlide.classList.remove('current-slide');
        //targetSlide.classList.add('current-slide');
    }

    const updateDots = () => {

    }

    const responsiveBtns = () => {

    }

    const prevSlide = (e) => {

    }

    const nextSlide = (e) => {
        const currentSlide = trackRef.current.querySelector('.current-slide');
        const nextSlide = trackRef.current.children.nextElementSibling;

        moveToSlide(currentSlide, nextSlide);
    }

    return (
        <div className="carousel">
            <button className="carousel_button carousel_button--left" ref={prevBtnRef}><FontAwesomeIcon icon={faCircleLeft} size="xl" style={{ color: "white" }} /></button>
            <div className="carousel_track-container">
                <ul className="carousel_track" ref={trackRef}>
                    {topMovies && topMovies.map((movie) => (
                        <li className="carousel_slide">
                            <img src={movie.image} alt="" />
                            <h2>{movie.title}</h2>
                        </li>
                    ))}
                </ul>
            </div>
            <button onClick={(e) => nextSlide(e)}className="carousel_button carousel_button--right" ref={nextBtnRef}><FontAwesomeIcon icon={faCircleRight} size="xl" style={{ color: "white" }} /></button>
            <div className="carousel_nav" ref={navDotsRef}>
                <button className="carousel_indicator current-slide"></button>
                {topMovies && Array.apply(0, Array(topMovies.length)).map(() => {
                    return <button className="carousel_indicator"></button>
                })}
            </div>
        </div>
     );
}

我最初的想法是由于某种原因,更改className导致useEffect触发,因此我添加了带有isLoading条件的if语句。但这并没有起作用,所以我不认为bug来自于useEffect钩子。

对此感到非常困惑,但这是我第一次使用Refs,所以完全有可能我错过了一些非常明显的东西。非常感谢您的帮助!

P粉946336138
P粉946336138

全部回复(0)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号