React - 错误:无效的钩子调用。 Hooks 只能在函数组件的主体内部调用

Posted

技术标签:

【中文标题】React - 错误:无效的钩子调用。 Hooks 只能在函数组件的主体内部调用【英文标题】:React - Error: Invalid hook call. Hooks can only be called inside of the body of a function component 【发布时间】:2021-03-30 17:55:03 【问题描述】:

我想使用 "React Bootstrap Hamburger Menu" HamburgerMenu 从那里复制代码,我收到错误 errorScreen "错误:无效的钩子调用。钩子只能在函数组件的主体内部调用。这可能由于以下原因之一发生:

    您可能有不匹配的 React 版本和渲染器(例如 React DOM) 您可能违反了 Hooks 规则 您可能在同一个应用程序中拥有多个 React 副本 有关如何调试和修复此问题的提示,请参阅 https://reactjs.org/link/invalid-hook-call。 "这是我的代码

Mobile_Navbar.jsx

import React,  Component  from 'react';
import 
  MDBNavbar,
  MDBNavbarBrand,
  MDBNavbarNav,
  MDBNavItem,
  MDBNavLink,
  MDBNavbarToggler,
  MDBCollapse,
  MDBContainer
 from 'mdbreact';
import  BrowserRouter as Router  from 'react-router-dom';

class Test extends Component 
  state = 
    collapseID: ''
  ;

  toggleCollapse = collapseID => () => 
    this.setState(prevState => (
      collapseID: prevState.collapseID !== collapseID ? collapseID : ''
    ));
  ;

  render() 
    return (
      <Router>
        <MDBContainer>
          <MDBNavbar
            color='light-blue lighten-4'
            style= marginTop: '20px' 
            light
          >
            <MDBContainer>
              <MDBNavbarBrand>Navbar</MDBNavbarBrand>
              <MDBNavbarToggler
                onClick=this.toggleCollapse('navbarCollapse1')
              />
              <MDBCollapse
                id='navbarCollapse1'
                isOpen=this.state.collapseID
                navbar
              >
                <MDBNavbarNav left>
                  <MDBNavItem active>
                    <MDBNavLink to='#!'>Home</MDBNavLink>
                  </MDBNavItem>
                  <MDBNavItem>
                    <MDBNavLink to='#!'>Link</MDBNavLink>
                  </MDBNavItem>
                  <MDBNavItem>
                    <MDBNavLink to='#!'>Profile</MDBNavLink>
                  </MDBNavItem>
                </MDBNavbarNav>
              </MDBCollapse>
            </MDBContainer>
          </MDBNavbar>
        </MDBContainer>
      </Router>
    );
  


export default Test;

App.js

import React from 'react';
import './App.css';
import Test from './components/Mobile_Menu/Mobile_Navbar';

function App(props) 
    return (
        <div className="App">
            <Test />
        </div>
    );


export default App;

【问题讨论】:

我在您发布的代码中没有看到任何挂钩调用。尽管一个明显的问题是您使用的是类组件而不是函数组件。 有趣,我只是从网站上复制代码 可能是库本身的问题,或者传递依赖图中的版本不匹配。我们无法提供帮助。 【参考方案1】:

当我们使用 mdbootstrap 库 MDBNavLink 组件时,似乎出现了某种问题。不过,我并没有深入解释其中的原因。

我通过从 react-router-dom 导入 Link 组件并将其与 className='nav-link' 一起使用来解决了这个问题。

import  Link  from "react-router-dom";

//Snippet
// [....]

<MDBNavItem>
  <Link
    className='nav-link'
    exact
    to='/'
    onClick=closeCollapse('mainNavbarCollapse')
    >
    Home
  </Link>
</MDBNavItem>

// [...]

【讨论】:

以上是关于React - 错误:无效的钩子调用。 Hooks 只能在函数组件的主体内部调用的主要内容,如果未能解决你的问题,请参考以下文章

React Native 错误:无效的钩子调用。 Hooks 只能在函数组件的主体内部调用

错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。 (React-hooks React-native)

React Hooks 不适用于 Firebase Cloud Functions 错误:不变违规:无效的钩子调用

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

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

× 错误:无效的挂钩调用。 Hooks 只能在函数组件的主体内部调用。[ReactJS]