Понятия не имею, что вы пытаетесь выполнить sh, но если вы добавите второй файл console.log в эффект, он не будет дважды регистрировать это.
- Первый набор журналов - от монтажа компонентов.
- Второй набор журналов - от обновления состояния, поставленного в очередь в
setTimeout
. - Третий (и последующий) набор журналов делает не происходит, потому что состояние на самом деле не обновляется (т. е. ему присваивается то же значение). Вы можете проверить это, установив начальное состояние на 1, то есть
useState(1)
, и вы увидите только монтажный набор журналов.
Код:
import React, { useState, useEffect } from "react";
import "./styles.css";
function AppRenderLog() {
console.log("app render");
return null;
}
export default function App() {
const [count, setCount] = useState(2);
useEffect(() => {
console.log("do something");
});
setTimeout(() => {
setCount(1);
setCount(1);
setCount(1);
});
useEffect(() => {
console.log("render by setCont(1)");
});
return (
<div className="App">
{count}
<AppRenderLog />
</div>
);
}
Console Log Выходные данные
app render
do something
render by setCont(1)
app render
do something
render by setCont(1)
Выход журнала консоли при начальном состоянии 1
app render
do something
render by setCont(1)