Я следую документация Apollo при подписке на данные из моей базы данных с использованием компонента <Query> и функции subscribeToMore.
Мне удалось заставить все работать правильно, однако у меня возникают проблемы с возвратом данных из подписки даже после изменения переменных запросов.
Вот мой код:
main.js
const DETAILED_CONVERSATION_QUERY = gql`
query CONVERSATION_QUERY($convoId: ID!){
detailedConversation(convoId: $convoId) {
messages(last: 200) {
text
}
}
}
`;
const DETAILED_CONVERSATION_SUBSCRIPTION = gql`
subscription($convoId: ID!) {
detailedConversation(convoId: $convoId) {
node {
messages(last: 1) {
text
}
}
}
}
`;
<Query
query = {DETAILED_CONVERSATION_QUERY}
variables = {{ convoId: activeConversationId }}
>
{({subscribeToMore, loading, error, data }) => {
if (loading) return <div className = "chat-overlay__convo-details__loading" />
const { messages, id, users } = data.detailedConversation;
return (
<Conversation
id = {id}
subscribeToNewMessages = {() => subscribeToMore({
document: DETAILED_CONVERSATION_SUBSCRIPTION,
variables: { convoId: activeConversationId },
updateQuery: (prev, { subscriptionData }) => {
if (!subscriptionData.data) return prev;
const newConvoDetails = subscriptionData.data.detailedConversation.node;
const { messages } = subscriptionData.data.detailedConversation.node;
const dataToReturn = Object.assign({}, newConvoDetails, {
messages: [ ...prev.detailedConversation.messages, ...messages]
})
return {detailedConversation: { ...dataToReturn }};
}
})}
messages = {messages}
setConversationId = {this.setConversationId}
chatOverlayActive = {chatOverlayActive}
/>
)
}}
</Query>
Разговор.js
class Conversation extends PureComponent {
componentDidMount() {
this.props.subscribeToNewMessages();
}
render() {
...
}
}
В основном происходит то, что есть идентификатор разговора (activeConversationId), который ссылается на разговор в моей базе данных, на который он подписан. Когда пользователь выбирает другой разговор, activeConversationId меняется, и компонент «Разговор» снова монтируется с новым разговором.
Моя проблема в том, что как только я монтирую определенный разговор, а затем переключаюсь на другой, похоже, он не отписывается от предыдущего. Я так понимаю, что когда переменные в компоненте <Query> изменяются, он автоматически отменяет мою предыдущую подписку.
Документы Apollo хороши, но немного расплывчаты, когда речь заходит о том, как обрабатываются отказы от подписки, поэтому было бы здорово, если бы кто-нибудь еще, у кого может быть такая же проблема, мог бы пролить свет.
Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для меня проблема была решена путем повторного полного повторного рендеринга компонента <Query>. Вроде не отписывается, просто меняя переменные в запросе.
Я также сталкиваюсь с той же проблемой, как снова выполнить повторную визуализацию компонента <Query>?
Не приведет ли изменение переменных запроса к повторному рендерингу в любом случае?