当前位置: 首页 > 知识库问答 >
问题:

无效的钩子调用。钩子只能在函数组件的主体内部调用

徐绪
2023-03-14

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

无效的挂接调用。钩子只能在函数组件的主体内部调用。这可能是以下原因之一:

  1. 您可能有不匹配的React和渲染器版本(如React DOM)
  2. 你可能违反了钩子规则
  3. 在同一个应用程序中可能有多个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;

共有3个答案

怀展
2023-03-14

您可以通过调用返回其React的Arrow函数来使用“导出默认值”。通过MaterialUI类对象道具传递组件,该道具将在组件渲染()中使用。

class AllowanceClass extends Component{
    ...
    render() {
        const classes = this.props.classes;
        ...
    }
}

export default () => {
    const classes = useStyles();
    return (
        <AllowanceClass classes={classes} />
    )
}
令狐晟
2023-03-14

当我使用npm link安装我的本地库时,我遇到了这个问题,我使用cra构建了本地库。我在这里找到了答案。字面意思是:

当您使用npm链接或等价物时,也会出现这个问题。在这种情况下,bundler可能会“看到”两个React——一个在应用程序文件夹中,一个在库文件夹中。假设'myapp'和'mylib'是兄弟文件夹,一个可能的修复方法是从'mylib'运行'npm link.../myapp/node_modules/反应'。这将使库使用应用程序的React副本。

因此,运行命令:npm link

严狐若
2023-03-14

只能从React函数调用钩子。在这里阅读更多。

只需将Allowance类组件转换为功能组件。

工作代码沙盒演示。

const Allowance = () => {
  const [allowances, setAllowances] = useState([]);

  useEffect(() => {
    fetch("http://127.0.0.1:8000/allowances")
      .then(data => {
        return data.json();
      })
      .then(data => {
        setAllowances(data);
      })
      .catch(err => {
        console.log(123123);
      });
  }, []);

  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 > {
      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;
 类似资料:
  • 我收到这个错误”无效的钩子呼叫。钩子只能在函数组件的主体内部调用。“当我尝试运行我的函数时。我试图运行一个脚本,生成reCaptcha令牌脚本如下: 这个组件应该生成令牌(这是我得到错误的地方) 在另一个组件中,我调用了前面的脚本组件,并传递了一个动作类型,但是我得到了提到的react钩子错误(仅显示相关代码)。 我想问题在于我调用/使用导入组件的方式,但我找不到解决方案?

  • 我得到以下错误,不确定我在箭头函数内实例化 react 钩子时做错了什么: 错误:挂接调用无效。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 您可能有不匹配的React和渲染器版本(如React DOM)。 您可能违反了钩子的规则。 同一应用程序中可能有多个React副本。请参阅https://reactjs.org/link/invalid-hook-call有关如何调试和修复此

  • 我在我的react项目中使用apollo graphql,我得到的错误是 无效的钩子调用。钩子只能在函数组件的主体内部调用 这是我的代码 一旦我运行了这个程序,我就得到了错误,我知道useQuery本身就是一个钩子,我不能从内部useEffect调用它,但是接下来应该怎么解决这个问题,因为我需要首先从我的redux状态中获取insuranceId并将其发送到查询。 谢谢

  • 问题内容: 我是React的新手,现在我想在表中显示一些记录,现在出现此错误。请帮帮我。 无效的挂接调用。挂钩只能在功能组件的主体内部调用。发生这种情况可能是由于以下原因之一:1.您的React和渲染器版本可能不匹配(例如React DOM)2.您可能违反了《胡克规则》 3.您可能在其中包含多个React版本相同的应用程序请参阅有关如何调试和解决此问题的提示。 问题答案: 因为你。在此处查看更多信

  • 我在使用hook时遇到此错误。我有它的基本形式,查看react文档作为参考,但仍然得到这个错误。我已经准备好面对掌心时刻。。。

  • 我是一个很新的反应,并得到以下错误: 我想在提交表单时使用另一个组件。因此,在文件A中,当表单提交时,is使用一个函数,在调用其他组件之前首先检查某些内容,如: 在组件上,我有一些usstate钩子: 当页面正在加载的时候,我得到了这个错误,有没有人知道什么是错误的?