如何在React和useRef钩子中使用数组获取多个引用?

问题描述 投票:0回答:1

我正在尝试使用GSAP在React(打字稿)中创建动画文本。

Text变量是一个字符串,它被分成字符串数组,形式是为每个字母创建单独的div。为了使GSAP具有动画效果,每个元素都需要有自己的ref-目前,只有最后一个字母起作用,因为只分配了一个ref。

如何为每个元素创建单独的ref并将它们传递给gsap?看到某个地方应该传递回调作为参考,但是我不确定该怎么做。

const TextAnimator: FC<TextAnimatorTypes> = ({ text }) => {
    const animatedLetter = useRef(null);

    const letterArray = text.split('');
    const letterElements = [];
    for (let i = 0; i < letterArray.length; i++) {
        letterElements.push(<div ref={animatedLetter} className={styles.letter}>{letterArray[i] === ' ' ? '\xa0' : letterArray[i]}</div>);
    }

    useEffect(() => {
        const random = (min: number, max: number) => {
            return (Math.random() * (max - min)) + min;
        };

        gsap.from(animatedLetter.current, {
            duration: 2.5,
            opacity: 0,
            x: 0,
            y: random(-200, 200),
            z: random(500, 1000),
            scale: .1,
            delay: 0.2,
            yoyo: true,
            repeat: -1,
            repeatDelay: 4,
            ease: Power1.easeOut
        });
    }, []);

    return (
        <div className={styles.box}>
            <p className={styles.animatedText}>
                {letterElements}
            </p>
        </div>
    );
};
javascript reactjs typescript react-hooks gsap
1个回答
0
投票
const TextAnimator: FC<TextAnimatorTypes> = ({ text }) => { const letterArray = text.split(''); const letterElements = []; const elementIds: string[] = []; for (let i = 0; i < letterArray.length; i++) { letterElements.push(<div className={styles.letter} id={letterArray[i] + i}>{letterArray[i] === ' ' ? '\xa0' : letterArray[i]}</div>); elementIds.push(letterArray[i] + i); } const random = (min: number, max: number) => { return (Math.random() * (max - min)) + min; }; useEffect(() => { for (let i = 0; i < elementIds.length; i++) { const element = document.getElementById(elementIds[i]); gsap.from(element, { duration: 2.5, opacity: 0, x: random(-500, 500), y: random(-500, 500), z: random(-500, 500), scale: .1, delay: i * .02, yoyo: true, repeat: -1, repeatDelay: 10, ease: Power1.easeOut }); } }, [elementIds]); return ( <div className={styles.box}> <p className={styles.animatedText}> {letterElements} </p> </div> ); };
© www.soinside.com 2019 - 2024. All rights reserved.