我想用React在一个表中显示一些记录,但我得到了这个错误:

无效的钩子调用。类的主体内部只能调用钩子 功能组件。这可能发生在以下情况之一 原因: React和渲染器的版本可能不匹配(比如React DOM) 你可能违反了胡克斯的规矩 你可能在同一个应用程序中有多个React副本,请参阅有关如何调试和调试的提示 解决这个问题。

import React, {
  Component
} from 'react';
import {
  makeStyles
} from '@material-ui/core/styles';
import Table from '@material-ui/core/Table';
import TableBody from '@material-ui/core/TableBody';
import TableCell from '@material-ui/core/TableCell';
import TableHead from '@material-ui/core/TableHead';
import TableRow from '@material-ui/core/TableRow';
import Paper from '@material-ui/core/Paper';

const useStyles = makeStyles(theme => ({
  root: {
    width: '100%',
    marginTop: theme.spacing(3),
    overflowX: 'auto',
  },
  table: {
    minWidth: 650,
  },
}));

class allowance extends Component {
  constructor() {
    super();
    this.state = {
      allowances: [],
    };

  }

  componentWillMount() {
    fetch('http://127.0.0.1:8000/allowances')
      .then(data => {

        return data.json();

      }).then(data => {

        this.setState({
          allowances: data
        });

        console.log("allowance state", this.state.allowances);
      })

  }



  render() {
    const classes = useStyles();
    return ( <
      Paper className = {
        classes.root
      } >
      <
      Table className = {
        classes.table
      } >
      <
      TableHead >
      <
      TableRow >
      <
      TableCell > Allow ID < /TableCell> <
      TableCell align = "right" > Description < /TableCell> <
      TableCell align = "right" > Allow Amount < /TableCell> <
      TableCell align = "right" > AllowType < /TableCell>

      <
      /TableRow> <
      /TableHead> <
      TableBody > {
        this.state.allowances.map(row => ( <
          TableRow key = {
            row.id
          } >
          <
          TableCell component = "th"
          scope = "row" > {
            row.AllowID
          } <
          /TableCell> <
          TableCell align = "right" > {
            row.AllowDesc
          } < /TableCell> <
          TableCell align = "right" > {
            row.AllowAmt
          } < /TableCell> <
          TableCell align = "right" > {
            row.AllowType
          } < /TableCell>                     <
          /TableRow>
        ))
      } <
      /TableBody> <
      /Table> <
      /Paper>
    );
  }

}

export default allowance;

当前回答

在我的情况下,问题是我cd到错误的目录进行npm安装。我只是在正确的目录中重新安装了库,它工作得很好!

其他回答

React linter假定每个方法都以使用钩子开始,并且钩子不能在类中工作。通过将const usstyles重命名为任何不以use开头的东西,比如const myStyles,就可以了。

更新:

makestyle是钩子api,你不能在类中使用它。你可以使用样式组件API。在这里看到的

使用依赖项而不安装依赖项时也会发生。 发生在我身上,当我从“@material-ui/icons/”调用MenuIcon时,在项目中丢失了。

当我链接本地图书馆时,我得到了这个错误。下面的方法解决了我的问题。

在图书馆:

从依赖中删除“react”和“react-dom”,并将它们添加到peerDependencies中。 安装依赖项,构建

重新启动主项目。

在我的情况下,我拆除了包装锁。Json和node_modules从两个项目和重新安装,现在工作得很好。


// project structure


root project
- package-lock.json
- package.json // all dependencies are installed here
- node_modules

-- second project
-- package-lock.json
-- package.json 
  "dependencies": {
    "react": "file:../node_modules/react",
    "react-dom": "file:../node_modules/react-dom",
    "react-scripts": "file:../node_modules/react-scripts"
  },
-- node_modules


不确定是什么原因导致了这个问题,因为这发生在我之前,并采取了与上面相同的步骤,问题已经解决了。

我用的是电子。 我测试了上面所有的答案,甚至深入到基础应用程序,发现这种情况仍然存在。

事实证明,如果你正在使用electron(在我的情况下,特别是expo-electron),它有它自己的webpack配置,并且你需要在webpack配置中白名单redux。我的electronic -webpack.js文件是这样的:

const { withExpoAdapter } = require("@expo/electron-adapter");

// Provide any overrides for electron-webpack: https://github.com/electron-userland/electron-webpack/blob/master/docs/en/configuration.md
module.exports = withExpoAdapter({
  projectRoot: __dirname,
  whiteListedModules: ["react-redux"],
});