Try @eslint-react/kit@beta
logoESLint React

no-leaked-interval

Enforces that every 'setInterval' in a component or custom hook has a corresponding 'clearInterval'.

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

react-web-api/no-leaked-interval

Full Name in @eslint-react/eslint-plugin

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

Presets

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

Rule Details

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

Examples

Setting interval without cleanup in useEffect

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

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

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

  return null;
}

Clearing interval in useEffect cleanup

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

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

  useEffect(() => {
    // Recommended: Store the interval ID
    const intervalId = setInterval(() => console.log(count), 1000);
    // Recommended: Clear the interval in the cleanup function
    return () => clearInterval(intervalId);
  }, []);

  return null;
}

Versions

Resources

Further Reading


See Also

On this page