maxeth / react-type-animation

A React typewriter animation based on typical with extended functionality and customization.
https://react-type-animation.netlify.app/
MIT License
427 stars 24 forks source link

Change sequence and restart typing animation #27

Open AlexString opened 1 year ago

AlexString commented 1 year ago

As it is mentioned in the Usage Notes

Immutability Due to the nature of the animation, this component is permanently memoized, which means that the component never re-renders unless you hard-reload the page, and hence props changes will not be reflected.

I'm using this nice package in a website where switching between languages is involved so I needed to change sequence on language change.

I made this workaround to achieve this and I hope this helps someone who is looking for something similar.

function useOnChangeSequence(sequence: any[]) {
    const [animationFlag, setAnimationFlag] = useState(false);

    // Put down flag when sequence changed
    useEffect(() => setAnimationFlag(false), [sequence]);

    useEffect(() => {
        if (animationFlag) return; // Avoid infinite loop
        setAnimationFlag(true); // raise flag to trigger animation
    }, [animationFlag]);

    return animationFlag;
}

And I'm using it like so:

const TypeWriterText: FC<ITypeWriterTextProps> = ({
    sequence,
    wrapper = 'p',
    onFinish,
    cursor = true,
    className = '',
}) => {
    const animationFlag = useOnChangeSequence(sequence);
    return (
        animationFlag ?
            <TypeAnimation
                cursor={cursor}
                sequence={sequence}
                speed={30}
                wrapper={wrapper}
                className={className}
            />
            : null
    );
};
karelric commented 1 year ago

I agree, the component is awesome but should react to sequence changes and re-render the components.

ihorml commented 1 year ago

@AlexString thanks for the workaround!

htranq commented 11 months ago

I thinks we can using the key prop for remount component, just naming value for each language code, that works for me.

             return (<TypeAnimation
                                key={lang} // lang is current language
                cursor={cursor}
                sequence={sequence}
                speed={30}
                wrapper={wrapper}
                className={className}
            />)

@maxeth may you update docs at Hot Reload not supported ? for how to remount the component, thanks you.

izcoser commented 7 months ago

@htranq what is the difference between this method vs the OP method? Certainly yours is cleaner but I wonder if there's any performance difference.