no-set-state-in-use-effect
Rule category
Correctness.
What it does
Disallow direct calls to the set
function of useState
in useEffect
.
Why is this bad?
Calling setState
directly in useEffect
is a common bad practice. It can lead to infinite update loops and other side effects.
Examples
Failing
import React, { function useEffect(effect: React.EffectCallback, deps?: React.DependencyList): void
Accepts a function that contains imperative, possibly effectful code.useEffect, function useState<S>(initialState: S | (() => S)): [S, React.Dispatch<React.SetStateAction<S>>] (+1 overload)
Returns a stateful value, and a function to update it.useState } from "react";
function function Example(): null
Example() {
const [const value: number
value, const setValue: React.Dispatch<React.SetStateAction<number>>
setValue] = useState<number>(initialState: number | (() => number)): [number, React.Dispatch<React.SetStateAction<number>>] (+1 overload)
Returns a stateful value, and a function to update it.useState(0);
function useEffect(effect: React.EffectCallback, deps?: React.DependencyList): void
Accepts a function that contains imperative, possibly effectful code.useEffect(() => {
const setValue: (value: React.SetStateAction<number>) => void
setconst setValue: (value: React.SetStateAction<number>) => void
Value(const value: number
value + 1);
// - Do not call the 'set' function of 'useState' directly in 'useEffect'.
}, []);
return null;
}
Passing
import React, { function useEffect(effect: React.EffectCallback, deps?: React.DependencyList): void
Accepts a function that contains imperative, possibly effectful code.useEffect, function useState<S>(initialState: S | (() => S)): [S, React.Dispatch<React.SetStateAction<S>>] (+1 overload)
Returns a stateful value, and a function to update it.useState } from "react";
function function Example(): null
Example() {
const [const value: number
value, const setValue: React.Dispatch<React.SetStateAction<number>>
setValue] = useState<number>(initialState: number | (() => number)): [number, React.Dispatch<React.SetStateAction<number>>] (+1 overload)
Returns a stateful value, and a function to update it.useState(0);
function useEffect(effect: React.EffectCallback, deps?: React.DependencyList): void
Accepts a function that contains imperative, possibly effectful code.useEffect(() => {
const const onLoad: () => void
onLoad = () => {
const setValue: (value: React.SetStateAction<number>) => void
setValue(const value: number
value + 1);
};
// ...
}, []);
return null;
}