项目中有一个地方用到打字机的效果,并且在文字显示完成之后可以选择是否自动跳转到下一步骤。另外这个打字机效果在多个页面模块中使用,区别是打字完成后是否跳转。
useEffect(() => {
let currentIndex = 0;
const interval = setInterval(() => {
if (currentIndex < originalText.length - 1) {
setText((prevText) => prevText + originalText[currentIndex]);
currentIndex++;
} else {
clearInterval(interval);
if (destination && destination.trim() !== '') {
timerRef.current = window.setTimeout(() => {
navigate(destination);
}, 1000); // 在1秒后跳转到目标页面
}
}
}, 100);
return () => {
clearInterval(interval);
if (timerRef.current) {
clearTimeout(timerRef.current);
}
};
}, [originalText, destination, navigate]);
在useEffect中,用了一个定时器来逐个字符地将原始文本添加到当前文本中。每100毫秒添加一个字符,直到添加完整个原始文本。然后,我们清除定时器以停止动画。另外引入了useHistory钩子来获取路由的history对象。在useEffect中,当打字机效果完成后,用setTimeout函数来延迟1秒后执行跳转操作。
import React from 'react';
import Typewriter from './Typewriter';
const App: React.FC = () => {
return (
<div>
<Typewriter originalText="Hello, World!" destination="/other-page" />
</div>
);
};
export default App;
其中 originalText 是需要打印的文本,destination 是文字打印完后需要跳转的页面。如果打印后停留当前页面则无需该参数。
实际效果
完整代码
import React, { useState, useEffect, useRef } from 'react';
import { useNavigate } from 'react-router-dom';
interface TypewriterProps {
originalText: string;
destination?: string;
}
const Typewriter: React.FC<TypewriterProps> = ({ originalText, destination }) => {
const [text, setText] = useState('');
const navigate = useNavigate();
const timerRef = useRef<number | null>(null);
## 核心代码
return (
<div className="typewriter">
<h1>{text}</h1>
</div>
);
};
export default Typewriter;