我正在使用<Mutation />
具有渲染道具 API 并尝试在 UI 中进行乐观响应的组件。
到目前为止,我在一个_onSubmit
函数中有这个块 -
createApp({
variables: { id: uuid(), name, link },
optimisticResponse: {
__typename: "Mutation",
createApp: {
__typename: "App",
id: negativeRandom(),
name,
link
}
}
});
我的<Mutation />
组件看起来像 -
<Mutation
mutation={CREATE_APP}
update={(cache, { data: { createApp } }) => {
const data = cache.readQuery({ query: LIST_APPS });
if (typeof createApp.id == "number") {
data.listApps.items.push(createApp);
cache.writeQuery({
query: LIST_APPS,
data
});
}
}}
>
{/*
some code here
*/}
</Mutation>
我知道该update
函数<Mutation />
运行两次,一次optimisticResponse
是运行,第二次是服务器响应返回。
第一次,我将它们id
作为number
. createApp
在optimisticResponse
哪里结账id: negativeRandom()
这就是为什么我update
的<Mutation />
组件中的道具有一个检查是否createApp.id
是number
然后将它推入数组的原因。这意味着如果从本地返回的数据则将其推送到本地缓存中,如果从服务器返回则不推送。
但发生的情况是数据仅在从服务器返回时显示。该函数update
运行两次,但不会将其推送到数组中。
我认为可能有3个问题-
推送本地状态时,该
update
功能不运行我试过使
fetchPolicy
等于cache-and-network
&cache-first
但它也没有工作。__typename
在optimisticResponse
. _ Idk ifMutation
是正确的值,所以我也尝试AppConnection
过,但它仍然不起作用。
完整的代码可以在这里找到。为简单起见,整个代码存在于一个文件中。它是一个非常简单的应用程序,有 2 个输入和 1 个提交按钮。看起来像 -