Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .pkgs/configs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@
"eslint-plugin-de-morgan": "^1.2.1",
"eslint-plugin-function": "^0.0.21",
"eslint-plugin-jsdoc": "^50.7.1",
"eslint-plugin-perfectionist": "^4.13.0",
"eslint-plugin-regexp": "^2.7.0",
"eslint-plugin-perfectionist": "^4.14.0",
"eslint-plugin-regexp": "^2.8.0",
"eslint-plugin-unicorn": "^59.0.1",
"typescript-eslint": "^8.33.1"
}
Expand Down
4 changes: 2 additions & 2 deletions .pkgs/eslint-plugin-local/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
"@typescript-eslint/utils": "^8.33.1",
"eslint-plugin-de-morgan": "^1.2.1",
"eslint-plugin-jsdoc": "^50.7.1",
"eslint-plugin-perfectionist": "^4.13.0",
"eslint-plugin-regexp": "^2.7.0",
"eslint-plugin-perfectionist": "^4.14.0",
"eslint-plugin-regexp": "^2.8.0",
"eslint-plugin-unicorn": "^59.0.1",
"string-ts": "^2.2.1",
"ts-pattern": "^5.7.1"
Expand Down
4 changes: 2 additions & 2 deletions apps/website/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"fumadocs-twoslash": "3.1.3",
"fumadocs-typescript": "4.0.5",
"fumadocs-ui": "15.5.0",
"lucide-react": "^0.511.0",
"lucide-react": "^0.512.0",
"next": "^15.3.3",
"next-view-transitions": "^0.3.4",
"react": "^19.1.0",
Expand Down Expand Up @@ -52,7 +52,7 @@
"eslint": "^9.28.0",
"eslint-plugin-de-morgan": "^1.2.1",
"eslint-plugin-import-x": "^4.15.0",
"eslint-plugin-perfectionist": "^4.13.0",
"eslint-plugin-perfectionist": "^4.14.0",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20",
"eslint-plugin-unicorn": "^59.0.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
},
"devDependencies": {
"@babel/core": "^7.27.4",
"@babel/eslint-parser": "^7.27.1",
"@babel/eslint-parser": "^7.27.5",
"@babel/preset-env": "^7.27.2",
"@babel/preset-react": "^7.27.1",
"@eslint/config-inspector": "^1.0.2",
Expand Down
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@
"typedoc-plugin-mdn-links": "^5.0.2",
"typescript": "^5.8.3",
"typescript-eslint": "^8.33.1",
"vitest": "^3.2.0"
"vitest": "^3.2.1"
},
"packageManager": "pnpm@10.11.1",
"engines": {
Expand All @@ -112,7 +112,7 @@
"@types/react-dom": "^19.1.5",
"cross-spawn": "^7.0.6",
"esbuild": "^0.25.5",
"lucide-react": "^0.511.0",
"lucide-react": "^0.512.0",
"next": "^15.3.3",
"react": "^19.1.0",
"react-dom": "^19.1.0",
Expand Down
27 changes: 27 additions & 0 deletions packages/plugins/eslint-plugin-react-hooks-extra/src/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
import { name, version } from "../package.json";

import noUnnecessaryUseCallback from "./rules-removed/no-unnecessary-use-callback";
import noUnnecessaryUseMemo from "./rules-removed/no-unnecessary-use-memo";
import noUnnecessaryUsePrefix from "./rules-removed/no-unnecessary-use-prefix";
import preferUseStateLazyInitialization from "./rules-removed/prefer-use-state-lazy-initialization";

import noDirectSetStateInUseEffect from "./rules/no-direct-set-state-in-use-effect";
import noDirectSetStateInUseLayoutEffect from "./rules/no-direct-set-state-in-use-layout-effect";

Expand All @@ -10,5 +16,26 @@ export const plugin = {
rules: {
"no-direct-set-state-in-use-effect": noDirectSetStateInUseEffect,
"no-direct-set-state-in-use-layout-effect": noDirectSetStateInUseLayoutEffect,

/**
* @deprecated Use the same rule from `eslint-plugin-react-x` or `@eslint-react/eslint-plugin` instead.
* @see https://next.eslint-react.xyz/docs/rules/no-unnecessary-use-callback
*/
"no-unnecessary-use-callback": noUnnecessaryUseCallback,
/**
* @deprecated Use the same rule from `eslint-plugin-react-x` or `@eslint-react/eslint-plugin` instead.
* @see https://next.eslint-react.xyz/docs/rules/no-unnecessary-use-memo
*/
"no-unnecessary-use-memo": noUnnecessaryUseMemo,
/**
* @deprecated Use the same rule from `eslint-plugin-react-x` or `@eslint-react/eslint-plugin` instead.
* @see https://next.eslint-react.xyz/docs/rules/no-unnecessary-use-prefix
*/
"no-unnecessary-use-prefix": noUnnecessaryUsePrefix,
/**
* @deprecated Use the same rule from `eslint-plugin-react-x` or `@eslint-react/eslint-plugin` instead.
* @see https://next.eslint-react.xyz/docs/rules/prefer-use-state-lazy-initialization
*/
"prefer-use-state-lazy-initialization": preferUseStateLazyInitialization,
},
} as const;
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
---
title: no-unnecessary-use-callback
---

**Full Name in `eslint-plugin-react-hooks-extra`**

```sh copy
react-hooks-extra/no-unnecessary-use-callback
```

**Full Name in `@eslint-react/eslint-plugin`**

```sh copy
@eslint-react/hooks-extra/no-unnecessary-use-callback
```

**Features**

`🧪`

## Description

Disallow unnecessary usage of `useCallback`.

React Hooks `useCallback` has empty dependencies array like what's in the examples, are unnecessary. The hook can be removed and it's value can be created in the component body or hoisted to the outer scope of the component.

## Examples

### Failing

```tsx
import React, { useCallback } from "react";

function MyComponent() {
const onClick = useCallback(() => {
console.log("clicked");
}, []);

return <button type="button" onClick={onClick} />;
}
```

### Passing

```tsx
import React from "react";

function onClick() {
console.log("clicked");
}

function MyComponent() {
return <button type="button" onClick={onClick} />;
}
```

## Implementation

- [Rule source](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-callback.ts)
- [Test source](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-hooks-extra/src/rules/no-unnecessary-use-callback.spec.ts)

---

## See Also

- [`no-unnecessary-use-memo`](./no-unnecessary-use-memo)\
Disallows unnecessary usage of `useMemo`.
Loading
Loading