Reactjs 乐观反应突变不';t在第二次更新中不包括服务器响应数据
与我发现的问题类似,当使用optimisticResponse和update进行突变时,服务器响应中设置的id是错误的。此外,id实际上是通过再次运行乐观函数来设置的 在下面的变体中,refetchQueries是故意注释掉的。我不想用那个。我只想通过更新来管理一切 还要注意optimisticResponse id前面有一个“-”,以证明optimistic函数运行了两次:Reactjs 乐观反应突变不';t在第二次更新中不包括服务器响应数据,reactjs,graphql,react-apollo,aws-appsync,Reactjs,Graphql,React Apollo,Aws Appsync,与我发现的问题类似,当使用optimisticResponse和update进行突变时,服务器响应中设置的id是错误的。此外,id实际上是通过再次运行乐观函数来设置的 在下面的变体中,refetchQueries是故意注释掉的。我不想用那个。我只想通过更新来管理一切 还要注意optimisticResponse id前面有一个“-”,以证明optimistic函数运行了两次: id:“-”\uuid() 突变 graphql(MutationCreateChild, { options:
id:“-”\uuid()
突变
graphql(MutationCreateChild, {
options: {
// refetchQueries: [{QueryAllChildren, variables: {limit: 1000}}],
update: (proxy, {data: {createChild}}) => {
const query = QueryAllChildren;
const data = proxy.readQuery({query});
data.listChildren.items.push(createChild);
proxy.writeQuery({query, data});
console.log("id: ", createChild.id);
}
},
props: props => ({
createChild: child => {
return props.mutate({
variables: child,
optimisticResponse: () => ({
createChild: {
...child,
id: "-" + uuid(),
__typename: "Child"
}
})
});
}
})
})
console.log语句的输出为:
id: -6c5c2a28-8bc1-49fe-92e1-2abade0d06ca
id: -9e0a1c9f-d9ca-4e72-88c2-064f7cc8684e
chrome开发者控制台中的实际请求如下所示:
{"data":{"createChild":{"id":"f5bd1c27-2a21-40c6-9da2-9ddc5f05fd40",__typename":"Child"}}}
这是一个错误还是我没有在更新功能中正确访问id?使用您的设置,我相信两次调用更新功能是正常的,您是正确的,来自服务器的真实id只会在第二次出现。Apollo获取您从
optimisticResponse
返回的对象,并将其传递给更新功能,以便您的UI可以立即显示更改,而无需等待服务器。当服务器响应返回时,将使用相同的状态(即没有乐观结果的状态)再次调用update函数,您可以使用服务器的正确值重新应用更改
至于为什么您列出的带有“-”的第二个
id
与您在chrome开发控制台中看到的id不同,我不确定。您确定实际上是该请求与对console.log的调用相匹配吗?这是一个已知问题,现已修复。我想它很快就会被发布到npm注册中心
谢谢你的解释,是的,你所描述的正是我所期望的。问题在于,对update函数的第二次调用实际上并不包括来自服务器的响应,而是在乐观响应中创建的同一个对象。我可以证实这种情况,因为进行“更新变异”而不是“创建变异”的工作方式是相同的。“创建变异”中id不同的原因是第二次调用uuid()函数。关闭并合并: