React 实现流式动画输出文本

作者:user 发布日期: 浏览量:34

React 实现流式动画输出钩子函数 useAnimatedText

import { animate, useMotionValue } from "framer-motion"
import { useEffect, useState } from "react"

let delimiter = "";
export function useAnimatedText(text: string) {
    let animatedCursor = useMotionValue(0);
    let [cursor, setCursor] = useState(0)
    let [prevText, setPrevText] = useState(text);
    let [isSameText, setIsSameText] = useState(true);

    if (prevText !== text) {
        setPrevText(text);
        setIsSameText(text.startsWith(prevText));

        if (!text.startsWith(prevText)) {
            setCursor(0);
        }
    }

    useEffect(() => {
        if (!isSameText) {
            animatedCursor.jump(0);
        }

        let controls = animate(animatedCursor, text.split(delimiter).length, {
            duration: 3,
            onUpdate(latest) {
                setCursor(Math.floor(latest))
            }
        });

        return () => controls.stop();
    }, [animatedCursor, isSameText, text])


    return text.split(delimiter).slice(0, cursor).join(delimiter);
}

useAnimatedText 使用

import { useAnimatedText } from "@/hooks/useAnimatedText.ts";

const [anwser, setAnswer] = useState("");
const animatedAnswer = useAnimatedText(anwser);


<div>{animatedAnswer}</div>