我有以下定义的函数:
const handleSave = useCallback(
async ({
id,
...values
}: EstimateTemplateFormState) => {
if (id && props.estimateTemplateId) {
# # # # # # # # # Updating # # # # # # # # # # #
const params = {
estimateTemplateId: id,
...values
};
const {
data
} = await updateEstimateTemplate({
variables: {
params
},
refetchQueries: ['fetchEstimateTemplate']
});
} else {
# # # # # # # # # Creating # # # # # # # # # # #
const params = values;
const {
data
} = await createEstimateTemplate({
variables: {
params
},
refetchQueries: ['fetchEstimateTemplate']
});
}
},
[createEstimateTemplate, updateEstimateTemplate, props.estimateTemplateId]
);
此函数与 formik 一起使用,为称为估计模板的实体实现自动保存功能。当我编辑一个这样的实体时,代码的更新部分从头到尾都按预期完美运行。然而,当我开始创建一个实体时,我遇到了这个问题:
Unknown query named "fetchEstimateTemplate" requested in refetchQueries options.include array
我不太明白为什么会这样。如果我不得不猜测,那一定是因为编辑估算模板实体存在,而在创建过程中则不存在。有什么办法可以解决这个问题吗?我对 React/graphql/apollo 不太熟悉,但我假设我缺少一些简单的东西来获取新创建的估计模板实体。
我的 graphql 函数定义如下:
query fetchEstimateTemplate($id: ID!) {
estimateTemplate(id: $id) {
.........fields........
}
}
来自文档:
refetchQueries 数组中的每个元素都是以下之一:
- 使用 gql 函数解析的 DocumentNode 对象
- 您之前执行的查询的名称,作为字符串(例如 GetComments)
- 要按名称引用查询,请确保每个应用程序的查询都有唯一的名称。
对于 GraphQL 查询
fetchEstimateTemplate
,当您第一次调用该查询时,该查询是如何命名的?查询的名称和实际执行的操作的名称之间存在差异。 Apollo 需要查询的名称,因为它是在 .graphql
文件中定义的或由 gql-tag
标记的。
例如,如果您的查询如下所示:
query GetEstimateTemplate($id: String!) {
fetchEstimateTemplate(id: $id) {
__typename
id
}
}
您会将
GetEstimateTemplate
传递到 refetchQueries
,而不是 fetchEstimateTemplate
。我不确定操作的 nae 与查询的名称是否使用了正确的术语,但这里最重要的是传入 query OPERATION_NAME_HERE
OPERATION_NAME_HERE
部分,而不是实际的查询它会在你的后端被调用。
我多次遇到这个问题。使用
refetchQueries
时应考虑两个概念:
refetchQueries
数组中的查询必须是您命名的查询。在您的示例中将是 fetchEstimateTemplate
(您应该首先使用大写字母命名查询)如果您对之前未调用过的查询调用重新获取,Apollo 将失败,因为它不知道那是什么。
希望这有帮助。