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

Posted

技术标签:

【中文标题】无效的钩子调用错误:只能在函数组件的主体内部调用钩子【英文标题】:Invalid hook call error: Hooks can only be called inside of the body of a function component 【发布时间】:2019-11-21 13:36:26 【问题描述】:

当我尝试向子组件添加挂钩以使函数可跨多个父组件重用时,我不断收到此Invalid hook call. Hooks can only be called inside of the body of a function component. 错误。

这个反应应用是通过create-react-app以通常的方式创建的。

我已经阅读了https://reactjs.org/warnings/invalid-hook-call-warning.html、https://github.com/facebook/react/issues/13991 和其他 *** 答案,但没有找到解决方案。 Uncaught Error: Hooks can only be called inside the body of a function component 类似,但我使用的是有效版本。

我尝试输入 npm ls react 以查看是否有两个版本正在运行,但只有一个版本显示: -- react@16.8.6

//Package.json

"react": "^16.8.6",
"react-dom": "^16.8.6",

//AdvancedSearch.jsx -- 子组件

export function HandleSearchFilterChange(props, e) 
   const setAdvancedSearchFilter = useState( props.advancedSearchFilter )[1]; //error triggered here

   useEffect(
      setAdvancedSearchFilter(
         e
      )
   );  

//ETablesAndSearch.js -- 父组件

import  HandleSearchFilterChange from '../Components/AdvancedSearch.jsx';

class ETablesAndSearch extends React.Component 
   render() 
      return(
         <AdvancedSearch onSearchFilterChange=HandleSearchFilterChange/>
      )
  

错误消息:“无效的钩子调用。钩子只能在函数组件的主体内部调用。这可能由于以下原因之一发生: 1. React 和渲染器的版本可能不匹配(例如 React DOM) 2. 你可能违反了 Hooks 规则 3. 你可能在同一个应用程序中拥有多个 React 副本” --at AdvancedSearch.jsx 设置常量时。

【问题讨论】:

正如错误试图告诉你的那样,你试图做的事情毫无意义。钩子只能应用于渲染。您是否阅读了第一个链接的“不支持”部分? 【参考方案1】:

您可以简单地将 class ETablesAndSearch 替换为功能组件。这将解决您的问题。

【讨论】:

【参考方案2】:

您的“HandleSearchFilterChange”不是功能组件。

它只是一个常规功能。正如反应所建议的那样“只能在函数组件的主体内部调用钩子”

应该有一些html元素使它成为一个功能组件。

【讨论】:

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

错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。 【我还在用函数组件】

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

React + Antd + Rollup 组件库“错误:无效的钩子调用。钩子只能在函数组件的主体内部调用”

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

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

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