reactjs - React Apollo 在变异后延迟更新缓存
问题描述
在运行 Mutation 后,我非常努力地更新 Apollo 缓存,但我无法在突变后消除 1 秒的延迟。
我按照'ac3-state-management-examples'来解决这个问题,但仍然找不到任何问题。这是我的客户端代码。
export const DELETE_ITEM_IN_CART = gql`
mutation DeleteItemInCart($cartItemId: String!) {
DeleteItemInCart(cartItemId: $cartItemId)
}
`;
export function useDeleteItemInCart() {
console.log(`DELETION START! ${Date()}`);
const [mutate, { data, error }] = useMutation<
DeleteItemInCartType.DeleteItemInCart,
DeleteItemInCartType.DeleteItemInCartVariables
>(DELETE_ITEM_IN_CART, {
update(cache, { data }) {
const deletedCartItemId = data?.DeleteItemInCart;
const existingCartItems = cache.readQuery<myCart>({
query: MY_CART,
});
if (existingCartItems && deletedCartItem && existingCartItems.myCart) {
cache.writeQuery({
query: MY_CART,
data: {
myCart: {
cartItem: existingCartItems.myCart.cartItem.filter(
t => t.id !== deletedCartItemId,
),
},
},
});
console.log(`DELETION OVER! ${Date()}`);
}
},
});
return { mutate, data, error };
}
这是我的服务器端突变
export const DeleteItemInCart = mutationField('DeleteItemInCart', {
args: {cartItemId: nonNull('String')},
type: nonNull('String'),
description: 'Delete an item in my cart',
resolve: (_, {cartItemId}, ctx) => {
const {prisma} = ctx;
try {
prisma.cartItem.delete({
where: {
id: cartItemId,
},
});
return cartItemId;
} catch (error) {
return cartItemId;
}
},
});
这是 Apollo-remote-state-management 的一个示例
export const DELETE_TODO = gql`
mutation DeleteTodo ($id: Int!) {
deleteTodo (id: $id) {
success
todo {
id
text
completed
}
error {
... on TodoNotFoundError {
message
}
}
}
}
`
export function useDeleteTodo () {
const [mutate, { data, error }] = useMutation<
DeleteTodoTypes.DeleteTodo,
DeleteTodoTypes.DeleteTodoVariables
>(
DELETE_TODO,
{
update (cache, { data }) {
const deletedTodoId = data?.deleteTodo.todo?.id;
const allTodos = cache.readQuery<GetAllTodos>({
query: GET_ALL_TODOS
});
cache.writeQuery({
query: GET_ALL_TODOS,
data: {
todos: {
edges: allTodos?.todos.edges.filter((t) => t?.node.id !== deletedTodoId)
},
},
});
}
}
)
return { mutate, data, error };
}
有什么建议吗?使用 1 秒延迟是不可避免的apollo cache
?
解决方案
推荐阅读
- vue.js - 如何在 vueJs 中绑定多个类
- python - 你可以在查询和正文中混合 Swagger 的参数吗?
- html - 在给定此布局的情况下,如何将跨度直接放置在电子邮件输入字段下方?
- selenium-webdriver - 我在使用 python 的 selenium webdriver 中遇到问题
- ruby-on-rails - Rspec:期望关联接收消息
- java - 对于 Junit 类型,方法 multiply(int, int) 未定义
- python-3.x - 在 python 中读取一个 20gb 的 csv 文件
- schema - Liquibase 无法执行混合大小写的模式(Snowflake),例如。(This_Schema)
- javascript - Phaser.Signal:监听器是 add() 的必需参数,应该是一个函数
- javascript - Javascript 将 [[ ]] 转换为 []