React components have built-in state
data. This data is used to store component property values. When state
changes, the
component is re-rendered. React provides the useState
hook to manage the state
. useState
returns a state
variable retaining the data and a state setter function to update its value.
React will skip re-rendering the component and its children if the new value you provide is identical to the current state, as determined by an
Object.is
comparison. When the setter function is called with the state variable as a parameter, that comparison will always be
true
, and the component will never be re-rendered. This can happen by mistake when attempting to reset a default value or invert a
boolean, among others.
This rule raises an issue when calling the setter function with the state variable provided by the same useState
React hook.
import { useState } from "react";
function ShowLanguage() {
const [language, setLanguage] = useState("fr-FR");
return (
<section>
<h1>Your language is {language}!</h1>
<button onClick={() => setLanguage(navigator.language)}>Detect language</button>
<button onClick={() => setLanguage(language)}>Je préfère le français</button>{/* Non compliant: This button does nothing */}
</section>
);
};
Instead, you should call the setter with any parameter different from the state variable.
import { useState } from "react";
function ShowLanguage() {
const [language, setLanguage] = useState("fr-FR");
return (
<section>
<h1>Your language is {language}!</h1>
<button onClick={() => setLanguage(navigator.language)}>Detect language</button>
<button onClick={() => setLanguage("fr-FR")}>Je préfère le français</button>
</section>
);
};