gpt4 book ai didi

javascript - 如何在突变后更新分页列表?

转载 作者:数据小太阳 更新时间:2023-10-29 05:28:22 26 4
gpt4 key购买 nike

我有一个包含消息列表的线程,它是通过 GET_THREAD_MESSAGES 查询获取的。该查询是分页的,根据用户之前是否看过该线程,可能会加载第一页、最后一页或仅加载新消息。 (即任何 first/after/before/last 都可以传递任何值)

thread(id: "asdf") {
messageConnection(after: $after, first: $first, before: $before, last: $last) {
edges {
cursor
node { ...messageInfo }
}
}
}

现在我有一个 sendMessage 突变,我调用它然后在该突变的 update 方法中我想乐观地将发送的消息添加到线程消息中更好的用户体验。如果没有分页,我知道我会这样做:

const data = store.readQuery({
query: GET_THREAD_MESSAGES,
variables: { id: message.threadId }
})

data.messageConnection.edges.push(newMessageEdge);

store.writeQuery({
query: GET_THREAD_MESSAGES,
variables: { id: message.threadId },
data,
})

不幸的是,因为我知道有分页,所以 store.readQuery 调用会抛出一个错误,提示“找不到该线程的字段 messageConnection”,因为该字段是现在类似于 messageConnection({ after: 'jfds1223asdhfl', first: 50, before: null, last: null })Apollo docs说应该在查询中使用 @connection 指令来解决这个问题。我尝试将查询更新为如下所示:

thread(id: "asdf") {
messageConnection(...) @connection(key: "messageConnection") {
edges {
cursor
node { ...messageInfo }
}
}
}

不幸的是,当我使用乐观更新返回并正确显示时,但一旦服务器返回存储的实际消息,我就会收到一条错误消息,提示 “{ node: { id: 中缺少字段游标: '...', timestamp: '...'",因为显然服务器返回的消息不是 MessageConnectionEdge,它只是节点,因此没有光标字段。

如何告诉 Apollo 只替换乐观响应的节点,而不是整个边缘?是否有另一种方法可以解决原始问题?

最佳答案

呼,我终于解决了这个问题。结果证明问题根本不在突变中,而是在为线程中的新消息并行运行的订阅中。 (捂脸)

TL;DR:如果您在突变发生变化时订阅了相同的数据,请确保在两种更新方法中包含相同的字段!

订阅方法如下所示:

subscribeToNewMessages: () => {
return props.data.subscribeToMore({
document: subscribeToNewMessages,
variables: {
thread: props.ownProps.id,
},
updateQuery: (prev, { subscriptionData }) => {
const newMessage = subscriptionData.data.messageAdded;
return Object.assign({}, prev, {
...prev,
thread: {
...prev.thread,
messageConnection: {
...prev.thread.messageConnection,
edges: [
...prev.thread.messageConnection.edges,
{ node: newMessage, __typename: 'ThreadMessageEdge' },
],
},
},
});
},
});
},

如果你有好眼力,你会立即发现问题:插入的边缘不提供光标——这正是 Apollo Client 在警告中告诉我们的!解决方法是将光标添加到插入的边缘:

{ node: newMessage, cursor: newMessage.id, __typename: 'ThreadMessageEdge' }

希望这可以帮助遇到此警告的其他人,确保对订阅和突变 update 方法进行三重检查!

关于javascript - 如何在突变后更新分页列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48242062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com