3 回答

TA貢獻1820條經驗 獲得超9個贊
它會在您的組件每次渲染時創建一個新的間隔,這會導致它再次渲染并最終導致無限循環。
嘗試這個:
import React, {useState, useEffect, useCallback} from "react";
import "./styles.css";
const arrayName = ['Tom','Alice','Matt','Chris'];
export default function App() {
const [name, setName] = useState();
const nameChange = useCallback(() => {
const rand = Math.floor(Math.random()*arrayName.length);
setName(arrayName[rand])
}, []);
useEffect(() => {
const interval = setInterval(() => {
setName('');
nameChange();
}, 2000)
return () => clearInterval(interval)
}, [nameChange]);
return (
<div className="App">
<h1>Hello {name}</h1>
</div>
);
}

TA貢獻1842條經驗 獲得超21個贊
問題是你從不這樣做clearInterval。每當組件調用時render,都會發出一個新的間隔。
Wrap setIntervalin useEffect,它在組件呈現時被調用。的返回useEffect是一個函數,它指示組件卸載階段發生的事情。在這里查看更多
useEffect(){
const tmp = setInterval(()=>{
setName('');
nameChange();
console.log(name);
}, 2000)
return () => { clearInterval(tmp); };
}

TA貢獻2041條經驗 獲得超4個贊
問題是每次渲染您的組件時,您都會創建一個新的間隔。
解決辦法是把setInterval的調用包裝在useEffect中,然后返回一個函數給useEffect清除interval。
import React, { useState, useCallback, useEffect } from 'react';
import './styles.css';
const arrayName = ['Tom', 'Alice', 'Matt', 'Chris'];
export default function App() {
const [name, setName] = useState();
const nameChange = useCallback(() => {
const rand = Math.floor(Math.random() * arrayName.length);
setName(arrayName[rand]);
}, [setName]);
useEffect(() => {
const intervalId = setInterval(() => {
setName('');
nameChange();
}, 2000);
return () => clearInterval(intervalId);
}, [nameChange]);
return (
<div className="App">
<h1>Hello {name}</h1>
</div>
);
}
添加回答
舉報