reactjs useEffect中的typewriter效果问题

anauzrmj  于 2023-02-03  发布在  React
关注(0)|答案(1)|浏览(163)

下面的代码跳过我的文本的索引1,并且只显示“hllo world”

export default function App() {
  const [message, setMessage] = useState("");
  const index = useRef(0);
  const text = "hello world";

  useEffect(() => {
    const interval = setInterval(() => {
      setMessage((prevMessage) => prevMessage + text[index.current]);
      index.current++;
    }, 500);

    return () => clearInterval(interval);
  }, []);

  return (
    <div className="App">
      <h1>{message}</h1>
    </div>
  );
}

但是如果我把这个集合状态改为

setMessage(text.substring(0, index.current));

这个很好用,我不知道是因为。

yhqotfr8

yhqotfr81#

我想是因为你的回电

(prevMessage) => prevMessage + text[index.current]

在使用setState时在队列中设置,并与索引的增量异步运行。可能存在数据争用。
当您使用substring方法时,您会立即得到您的字符串,因此它与增量完全同步。
请看一下这个文档,虽然我认为它并不明显,但是您的案例是setState异步特性的一个很好的例子。

相关问题