当我尝试向子组件添加钩子以使函数可在多个父组件中重用时,我不断收到这个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 和其他堆栈溢出答案,但没有找到解决方案。未捕获的错误:钩子只能在函数组件的主体内调用,这与函数组件类似,但我使用的是有效版本。
我尝试键入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.你可能违反了钩子的规则 3. 您可能在同一应用程序中有多个 React 副本" --在 AdvancedSearch.jsx 设置常量时。
您可以简单地将类 ETablesAndSearch替换为功能组件。这将解决您的问题。
您的"HandleSearchFilterChange"不是功能组件。
它只是一个常规功能。正如 react 所建议的那样"钩子只能在函数组件的主体内部调用">
应该有一些 html 元素来使其成为功能组件。