I create a react library using https://www.npmjs.com/package/create-react-library And successfully used it on other React project. But when I tried to use react hooks functionalities inside library it gives me following error.
Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: 1. You might have mismatching versions of React and the renderer (such as React DOM) 2. You might be breaking the Rules of Hooks 3. You might have more than one copy of React in the same app .....
My Library I just tried to use useState as follows in my component.
import React, { useState } from 'react' const General = (props) => { const [count, setCount] = useState(0); return ( <div> General component </div> ) } export default General
I am using "react": "^16.8.6"
and "react-dom": "^16.8.6"
My React APP Created a application using https://github.com/facebook/create-react-app and used above library as follows.
import Reactfrom 'react' import { General } from 'my.lib' const accountSummary = props => { return ( <div> <General> </div> ) } export default accountSummary
Both has same react versions and library has used same react-dom and react versions as peerDependencies
Don't call Hooks inside loops, conditions, or nested functions. Instead, always use Hooks at the top level of your React function, before any early returns. By following this rule, you ensure that Hooks are called in the same order each time a component renders.
No. Custom Hooks are a mechanism to reuse stateful logic (such as setting up a subscription and remembering the current value), but every time you use a custom Hook, all state and effects inside of it are fully isolated.
Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: You might have mismatching versions of React and the renderer (such as React DOM) You might be breaking the Rules of Hooks.
I was including my component library (for that matter any library) in my application as @Janith did using my-comp-lib:"file:../.."
(I don't want to publish every time I want to test) and I encountered the same issue.
Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
- You might have mismatching versions of React and the renderer (such as React DOM)
- You might be breaking the Rules of Hooks
- You might have more than one copy of React in the same app See react-invalid-hook-call for tips about how to debug and
fix this problem
I was able to fix this by making my app and library point to the same react (package) location.
Below are the steps I followed : 1. In Your Application: a) cd node_modules/react && npm link b) cd node_modules/react-dom && npm link 2. In Your Library a) npm link react b) npm link react-dom 3)Stop your dev-server and do `npm start` again.
It works!!
Please refer below links for more details ..
https://github.com/facebook/react/issues/14721
https://github.com/facebook/react/pull/14690
https://github.com/facebook/react/issues/13991
Note : This issue will not happen if you publish your package to artifactory and install because you will have react & react-dom as peer-dependencies and they won't get included in the distribution. So your package and application use the same react which is installed in the application.
I had the same issue, working with a rush monorepo, configuring ui-package and building the apps using nextjs.
The solutions was add the follow code on package.json
"resolutions": { "react": "17.0.1", // verificate your react version "react-dom": "17.0.1" }
In the library's package.json
:
"peerDependencies": { "react": "17.0.1", "react-dom": "17.0.1" },
See more here: https://github.com/vercel/next.js/issues/9022#issuecomment-728688452
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With