logoESLint React
Rules

no-leaked-timeout

Enforces that every 'setTimeout' in a component or custom hook has a corresponding 'clearTimeout'.

Full Name in eslint-plugin-react-web-api

react-web-api/no-leaked-timeout

Full Name in @eslint-react/eslint-plugin

@eslint-react/web-api-no-leaked-timeout

Presets

web-api recommended recommended-typescript recommended-type-checked strict strict-typescript strict-type-checked

Rule Details

Scheduling a timeout within the setup function of useEffect without canceling it in the cleanup function can lead to unwanted setTimeout callback executions and may also result in stale values captured by previous renders' effects after each subsequent re-render.

Common Violations

Invalid

import React, { useEffect, useState } from "react";

function MyComponent() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const timeoutId = setTimeout(() => console.log(count), 1000);
    //                ^^^ A 'setTimeout' created in 'useEffect' must be cleared in the cleanup function.
  }, []);

  return null;
}

Valid

import React, { useEffect, useState } from "react";

function MyComponent() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const timeoutId = setTimeout(() => console.log(count), 1000);
    return () => clearTimeout(timeoutId);
  }, []);

  return null;
}

Resources

Further Reading


See Also

On this page