react-hooks - 调用 Apollo useQuery() 时出现 React Hook 错误
问题描述
我在尝试使用 useQuery() 时收到以下错误。如果您需要更多详细信息,请告诉我。
错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 1. 你可能有不匹配的 React 版本和渲染器(例如 React DOM) 2. 你可能违反了 Hooks 规则 3. 你可能有多个 React 副本相同的应用程序请参阅有关如何调试和解决此问题的提示。
我的代码如下...
获取字符-action.js
import React from "react";
import * as ACTION_TYPES from "./../constants/action-types";
import { useQuery } from "@apollo/react-hooks";
import gql from 'graphql-tag';
export const getCharactersSuccess = (data) => {
return {
type:ACTION_TYPES.LOAD_CHARACTERS_SUCCESS,
data
}
}
export const getCharactersInProgress = () => {
return {
type:ACTION_TYPES.LOAD_CHARACTERS_INPROGRESS
}
}
export const getCharactersError = (error) => {
return {
type:ACTION_TYPES.LOAD_CHARACTERS_ERROR,
error
}
}
const GET_CHARACTERS =gql`
{
allPersons {
name
gender
homeworld {
name
}
species {
name
language
classification
}
}
}`;
export const useGetCharacters= () => {
const { loading, error, data } = useQuery(GET_CHARACTERS);
if(loading) {
getCharactersInProgress();
}
if(error) {
getCharactersError(error);
}
if(data) {
getCharactersSuccess(data);
}
}
上下文状态配置.js
export const ContextState = (props) => {
// const [stateReducer, dispatchReducer] = useReduceWithLogger(Reducer.AppLoadingReducer,Reducer.initialState);
const [stateReducer, dispatchReducer] = useReducer(Reducer.MainReducer,Reducer.initialState);
const handleDispatchAppLoadingInProgress = () => {
dispatchReducer(GENERIC_ACTION.appLoadingInprogress());
}
const handleDispatchAppLoadingSuccess = () => {
dispatchReducer(GENERIC_ACTION.appLoadingSuccess());
}
// const getCharacters = () => {
// dispatchReducer(GET_CHARACTERS_ACTION.useGetCharacters());
// }
const graphqlClient = new ApolloClient({
uri: "https://swapi.graph.cool/"
});
return (
<div>
<ApolloProvider client={graphqlClient}>
<Context.Provider
value={{
// reducer
isAppReady: stateReducer.isAppReady,
dispatchAppLoading: () => handleDispatchAppLoadingInProgress(),
dispatchAppLoaded: () => handleDispatchAppLoadingSuccess(),
// get character action
getCharacters: () => dispatchReducer(GET_CHARACTERS_ACTION.useGetCharacters())
}}
>
{
props.children
}
</Context.Provider>
</ApolloProvider>
</div>
)
}
解决方案
您不能GET_CHARACTERS_ACTION.useGetCharacters()
在另一个函数内部调用它,就像自定义反应钩子应该只在您的功能反应组件内部调用。
推荐阅读
- python - 创建 Bot 以使用 python 自动执行银行任务
- mysql - 在 AWS 中安全读取 RDS 实例数据库
- python - Python - 确定从一个时期到下一个时期的价值变化
- php - 将变量从 PHP 传递到 Python
- ios - 应用程序图标集有未分配的子项(删除、清理和构建仍然无济于事)。
- batch-file - 执行 Visual Studio 的批处理命令以 cmd 启动,而不是启动
- python - 将 csv 转换为 json(嵌套对象)
- sparql - year() 函数在 SPARQL (Protege) 中不起作用
- javascript - 如何使用 angularfire2 读取和更新同一个文档?
- reactjs - 打字稿类型描述在函数中的位置