3 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊
它會(huì)在您的組件每次渲染時(shí)創(chuàng)建一個(gè)新的間隔,這會(huì)導(dǎo)致它再次渲染并最終導(dǎo)致無(wú)限循環(huán)。
嘗試這個(gè):
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貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超22個(gè)贊
問(wèn)題是你從不這樣做clearInterval。每當(dāng)組件調(diào)用時(shí)render,都會(huì)發(fā)出一個(gè)新的間隔。
Wrap setIntervalin useEffect,它在組件呈現(xiàn)時(shí)被調(diào)用。的返回useEffect是一個(gè)函數(shù),它指示組件卸載階段發(fā)生的事情。在這里查看更多
useEffect(){
const tmp = setInterval(()=>{
setName('');
nameChange();
console.log(name);
}, 2000)
return () => { clearInterval(tmp); };
}

TA貢獻(xiàn)2041條經(jīng)驗(yàn) 獲得超4個(gè)贊
問(wèn)題是每次渲染您的組件時(shí),您都會(huì)創(chuàng)建一個(gè)新的間隔。
解決辦法是把setInterval的調(diào)用包裝在useEffect中,然后返回一個(gè)函數(shù)給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>
);
}
添加回答
舉報(bào)