You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中自定义打字动画异常问题排查求助

打字动画组件问题排查与修复

问题原因分析

  1. Jobs页面动画仍运行:RenderTb组件的useEffect未监听startTyping变量,初始化时未判断状态就启动了动画逻辑;且未在startTyping变为false时停止动画。
  2. 页面切换后动画异常:组件切换时未清除定时器,导致多个定时器实例同时运行,文本状态也未重置,切回页面后动画逻辑混乱。

修复方案

修改RenderTb组件逻辑,核心是监听startTyping状态变化、及时清除定时器、重置文本状态:

import { useEffect, useState, useRef } from "react";

const RenderTb = ({ text, startTyping = false }) => {
  const [displayText, setDisplayText] = useState("");
  const [currentIndex, setCurrentIndex] = useState(0);
  const timerRef = useRef(null);

  useEffect(() => {
    if (startTyping) {
      // 重置状态,确保每次启动都是从头开始
      setDisplayText("");
      setCurrentIndex(0);
      
      timerRef.current = setInterval(() => {
        setCurrentIndex((prev) => {
          if (prev >= text.length) {
            clearInterval(timerRef.current);
            return prev;
          }
          setDisplayText((prev) => prev + text[prev]);
          return prev + 1;
        });
      }, 100);
    } else {
      // 停止动画并重置文本
      clearInterval(timerRef.current);
      setDisplayText("");
      setCurrentIndex(0);
    }

    // 组件卸载时清理定时器
    return () => clearInterval(timerRef.current);
  }, [startTyping, text]); // 监听startTyping和text的变化

  return <div>{displayText}</div>;
};

export default RenderTb;

关键修复点说明

  • 将startTyping加入useEffect依赖数组,保证状态变化时触发逻辑更新
  • 启动动画前重置displayText和currentIndex,避免残留状态影响新的打字流程
  • startTyping为false时立即清除定时器并重置文本,终止动画
  • 组件卸载时清除定时器,避免内存泄漏和残留定时器干扰后续逻辑

内容的提问来源于stack exchange,提问作者user3872094

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:05:33