React Apollo — отписка от запросов

Я следую документация 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 хороши, но немного расплывчаты, когда речь заходит о том, как обрабатываются отказы от подписки, поэтому было бы здорово, если бы кто-нибудь еще, у кого может быть такая же проблема, мог бы пролить свет.

Спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
768
1

Ответы 1

Для меня проблема была решена путем повторного полного повторного рендеринга компонента <Query>. Вроде не отписывается, просто меняя переменные в запросе.

Не приведет ли изменение переменных запроса к повторному рендерингу в любом случае?

clodal 30.07.2019 13:21

Я также сталкиваюсь с той же проблемой, как снова выполнить повторную визуализацию компонента <Query>?

Rizwan 11.09.2019 15:14

Другие вопросы по теме