react/packages/eslint-plugin-react-hooks
lauren fd2d279984
[eslint-plugin-react-hooks] Inline meta fields (#32115)
rollup doesn't inline cjs requires (although it can with an external
plugin), so requiring package.json was causing issues internally at Meta
since that file doesn't exist there.

We could teach our build scripts to do so but given that the eslint meta
field is optional anyways I opted to just hardcode the name and omit the
version.
2025-01-17 15:16:36 -05:00
..
__tests__ react-hooks/rules-of-hooks: detect issues in class properties (#31823) 2025-01-06 12:12:09 +01:00
npm Don't minify symbols in production builds (#28881) 2024-04-20 11:23:46 -04:00
src [eslint-plugin-react-hooks] Inline meta fields (#32115) 2025-01-17 15:16:36 -05:00
CHANGELOG.md eslint-plugin-react-hooks: Release 5.0.0 (#31176) 2024-10-11 14:51:59 +02:00
index.js [Codemod] Update copyright header to Meta (#25315) 2022-10-18 11:19:24 -04:00
package.json react-hooks/rules-of-hooks: detect issues in class properties (#31823) 2025-01-06 12:12:09 +01:00
README.md feat(eslint-plugin-react-hooks): support flat config (#30774) 2025-01-16 18:39:11 -05:00

eslint-plugin-react-hooks

This ESLint plugin enforces the Rules of Hooks.

It is a part of the Hooks API for React.

Installation

Note: If you're using Create React App, please use react-scripts >= 3 instead of adding it directly.

Assuming you already have ESLint installed, run:

# npm
npm install eslint-plugin-react-hooks --save-dev

# yarn
yarn add eslint-plugin-react-hooks --dev

Legacy Config (.eslintrc)

If you are still using ESLint below 9.0.0, please continue to use recommended-legacy. To avoid breaking changes, we still support recommended as well, but note that this will be changed to alias the flat recommended config in v6.

{
  "extends": [
    // ...
    "plugin:react-hooks/recommended-legacy"
  ]
}

Flat Config (eslint.config.js)

For ESLint 9.0.0 and above users, add the recommended-latest config.

import reactHooks from 'eslint-plugin-react-hooks';

export default [
  // ...
  reactHooks.configs['recommended-latest'],
];

Custom Configuration

If you want more fine-grained configuration, you can instead add a snippet like this to your ESLint configuration file:

Legacy Config (.eslintrc)

{
  "plugins": [
    // ...
    "react-hooks"
  ],
  "rules": {
    // ...
    "react-hooks/rules-of-hooks": "error",
    "react-hooks/exhaustive-deps": "warn"
  }
}

Flat Config (eslint.config.js)

import reactHooks from 'eslint-plugin-react-hooks';

export default [
  {
    files: ['**/*.{js,jsx}'],
    plugins: { 'react-hooks': reactHooks },
    // ...
    rules: {
      'react-hooks/rules-of-hooks': 'error',
      'react-hooks/exhaustive-deps': 'warn',
    }
  },
];

Advanced Configuration

exhaustive-deps can be configured to validate dependencies of custom Hooks with the additionalHooks option. This option accepts a regex to match the names of custom Hooks that have dependencies.

{
  "rules": {
    // ...
    "react-hooks/exhaustive-deps": ["warn", {
      "additionalHooks": "(useMyCustomHook|useMyOtherCustomHook)"
    }]
  }
}

We suggest to use this option very sparingly, if at all. Generally saying, we recommend most custom Hooks to not use the dependencies argument, and instead provide a higher-level API that is more focused around a specific use case.

Valid and Invalid Examples

Please refer to the Rules of Hooks documentation to learn more about this rule.

License

MIT