Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug: eslint-plugin-react-hooks disallows the use of useId in async component even though it works #31187

Open
axeleroy opened this issue Oct 11, 2024 · 2 comments

Comments

@axeleroy
Copy link

In #27045 the eslint-plugin-react-hooks has been modified to disallow the use of any hooks in async components, justified by this sentence:

Hooks cannot be called in async functions, on either the client or the server.

However, some hooks can be called in async components, namely useId. Or at least the documentation does not mention it1.

React version: 18.3.1
eslint-plugin-react-hooks: 5.0.0

Steps To Reproduce

  1. Create an async component that uses useId
export default async function Component() {
  const id = useId();
  return null;
}
  1. ESLint will throw the following error:
Error: React Hook "useId" cannot be called in an async function.  react-hooks/rules-of-hooks

The current behavior

ESLint throws an error when an async component uses useId.

The expected behavior

No ESLint error.

Footnotes

  1. The documentation for React 19 does not mention it as well.

@axeleroy axeleroy added the Status: Unconfirmed A potential issue that we haven't yet confirmed as a bug label Oct 11, 2024
@eps1lon eps1lon added Component: ESLint Rules Type: Bug and removed Status: Unconfirmed A potential issue that we haven't yet confirmed as a bug labels Oct 11, 2024
@eps1lon eps1lon self-assigned this Oct 13, 2024
@eps1lon
Copy link
Collaborator

eps1lon commented Oct 15, 2024

Had some further discussions internally.

Or at least the documentation does not mention it1.

No Hook can be called in async Components. You can call it in a sync Component that is used in the Server environment i.e. useId can be used in shared Components.

@axeleroy
Copy link
Author

axeleroy commented Oct 15, 2024

I don't understand the logic for preventing any hooks that can run in a Server Component to be called in async components, especially for a hook as benign as useId 🤔

An explanation would be welcome, I might have missed something here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants