react - 无效的钩子调用。未捕获的错误:缩小的 React 错误 #321

IT技术 javascript node.js reactjs npm webpack
2021-04-28 07:57:24

我正在尝试实施微前端概念。为此,我将有以下react应用程序。

  • 容器
  • 标题
  • 仪表板

所有 3 个都是单独的应用程序。Header并且Dashboard- 我想在Container应用程序中使用它

对于Header应用程序,它是一个简单的react功能组件。我在webpack.config.js.

output: {
    path: path.join(__dirname, '/dist'),
    filename: 'header-bundle.js',
    library: 'TestHeader',
    libraryTarget: 'umd'
  },

package.json

"main": "dist/header-bundle.js",
  "peerDependencies": {
    "react": "16.12.0"
  },
  "devDependencies": {
    "@babel/cli": "^7.8.3",
    "@babel/core": "^7.8.3",
    "@babel/preset-env": "^7.8.3",
    "@babel/preset-react": "^7.8.3",
    "babel-loader": "^8.0.6",
    "html-webpack-plugin": "^3.2.0",
    "react": "^16.12.0",
    "react-dom": "^16.12.0",
    "webpack": "^4.41.5",
    "webpack-cli": "^3.3.10",
    "webpack-dev-server": "^3.10.1"
  }
  • 难道npm linkHeader

Container应用程序中: -npm link Header

在 的App.js组成部分Container

import React from 'react';
import Header from 'header-app';

const App = props => {
  return (
    <div>
      <Header content="Header via container"></Header>
    </div>
  );
};

export default App;

这工作正常。

但是当我添加Dashboard使用 的组件react hooks,我收到关于无效钩子调用的错误。

Dashboard应用程序也有react作为peerDependencies单独的Dashboard应用程序工作正常。

Dashboard 零件:

import React, { useState, useEffect } from 'react';
import NoIcon from './no_icon.png';

const Card = props => {
  return (
    <div style={{ margin: '1em' }}>
      <img alt="avatar" style={{ width: '70px' }} src={NoIcon} />
      <div>
        <div style={{ fontWeight: 'bold' }}>{props.label}</div>
      </div>
    </div>
  );
};

const CardList = props => {
  return (
    <div
      style={{
        display: 'grid',
        gridTemplateColumns: 'repeat(3, auto)'
      }}
    >
      {props.cards.map(card => (
        <Card {...card} key={card.id} />
      ))}
    </div>
  );
};

const Dashboard = props => {
  // const { apps } = props;
  const [hasError, setErrors] = useState(false);
  const [apps, setApps] = useState([]);

  async function fetchData() {
    const res = await fetch('src/data.json');
    res
      .json()
      .then(res => setApps(res))
      .catch(err => setErrors(err));
  }

  useEffect(() => {
    fetchData();
  }, []);

  return (
    <div>
      <CardList cards={apps} />
    </div>
  );
};

export default Dashboard;

我在这里有几个问题:

  • 如何react在一个react应用程序中使用多个应用程序?
  • 将整个react应用程序作为单个组件导出umd库并在另一个应用程序中使用它是正确的方法吗?
  • 我该如何解决这个react钩子错误reactaspeerDependencies在库和使用它的应用程序中如何工作?
1个回答

如何在一个 React 应用程序中使用多个 React 应用程序?

你这样做是正确的。每个 React 应用程序都单独打包,然后在需要的地方导入。

将整个react应用程序作为单个组件导出为 umd 库并在另一个应用程序中使用它是正确的方法吗?

这是一种方式是的。

当 peerDependencies 在库和使用它的应用程序中工作时,如何react?

peerDependencies 允许您在安装包之前声明应该已经安装的库和版本。

例如,当您在 package.json 中为 Header 编写此内容时

  "peerDependencies": {
    "react": "16.12.0"
  },

您是说 Container 应用程序应该具有react@16.12.0才能与 Header 一起使用。应将相同的对等依赖项添加到仪表板。

我该如何解决react-hooks的这个错误?

由于您没有包含错误消息,我假设您指的是不应有条件地调用钩子的错误。为了修复该错误,我们需要对您的应用程序进行最少的复制,以便我们对其进行测试。在你的例子中没有什么可做的。