React's useState should not be directly called
Cette page n'est pas encore disponible en français, sa traduction est en cours.
Si vous avez des questions ou des retours sur notre projet de traduction actuel,
n'hésitez pas à nous contacter.
ID: tsx-react/usestate-direct-usage
Language: TypeScript
Severity: Error
Category: Performance
Description
This rule prevents infinite rendering loop bugs in React. The bug occurs when a hook setter function is called directly in the body of a component, because this changes the component’s state. When a component’s state is changed, re-rendering occurs.
Ensure that you do not directly call hook setter functions in components, and instead call them from an event handler.
Non-Compliant Code Examples
import { useState, useEffect } from "react";
function ShowTime() {
const [time, setTime] = useState(new Date().toLocaleTimeString());
setTime(new Date().toLocaleTimeString());
return (
<section>
<h1>The current time is {time}</h1>
<button onClick={() => setTime(new Date().toLocaleTimeString())}>Update Time</button>
</section>
);
}
Compliant Code Examples
import { useState, useEffect } from "react";
function ShowTime() {
const [time, setTime] = useState(new Date().toLocaleTimeString());
useEffect(() => {
const timer = setInterval(() => {
setTime(new Date().toLocaleTimeString());
}, 1000);
return () => clearInterval(timer);
}, []);
return (
<section>
<h1>The current time is {time}</h1>
<button onClick={() => setTime(new Date().toLocaleTimeString())}>Update Time</button>
</section>
);
}