Skip to content

问题复现

在开发 React 项目并引入组件库时,如果组件库依赖 React 并使用了自己的 React 实例,那么在项目中使用 Hooks 可能会遇到以下错误:

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

解决方案

方法一:使用 Webpack 配置

在 Webpack 配置文件中,使用 resolve.alias 配置项将项目中的 React 实例路径映射到组件库中的 React 实例路径。这样,Webpack 会将项目中使用的 React 实例替换为组件库中的 React 实例,从而避免多实例问题。以下是具体步骤:

打开 Webpack 配置文件,通常是 webpack.config.js。

在 resolve 配置项中添加 alias 配置,将项目中的 React 实例路径映射到组件库中的 React 实例路径。例如:

js
// webpack.config.js
resolve: {
  alias: {
    'react': path.resolve(__dirname, './node_modules/components-lib/node_modules/react'),
      'react-dom': path.resolve(__dirname, './node_modules/components-lib/node_modules/react-dom'),
  }
}

其中,'./node_modules/components-lib'是组件库的路径。

保存 Webpack 配置文件并重新启动开发服务器。

如果你是在开发组件库,并且在项目中使用了 npm link 来引用组件库,可以使用 npm link 来解决这个问题。以下是具体步骤:

在组件库的根目录下运行以下命令:

bash
npm link

在项目的根目录下运行以下命令:

bash
npm link <component-library>

其中,是组件库的名称。

使用 npm link 命令后,项目中将使用组件库中的 React 实例,从而避免多实例问题。

总结

以上是两种解决 React 多实例导致无法使用 Hooks 的错误的方法。使用 Webpack 配置将项目中的 React 实例路径映射到组件库中的 React 实例路径,或者使用 npm link 将项目中的 React 实例替换为组件库中的 React 实例。