Как повторно получить локальный запрос, когда какой-то другой запрос был повторно? - PullRequest
0 голосов
/ 14 января 2019

Я пишу приложение на Reaction + Apollo и столкнулся с вопросом, который, я не уверен, был решен мной наилучшим образом. Обращаемся за помощью к профессионалам в построении реакции + приложения apollo.

Предположим, что в компании есть список пользователей, и пользователь удаляет себя из этого списка. Я называю мутацию, давайте назовем это DELETE_USER_FROM_COMPANY, затем я сообщаю Apollo, какие запросы должны быть повторно получены (USER_COMPANY_LIST), все в порядке. За исключением одного момента, который я не могу решить красиво: существует локальный запрос SELECTED_COMPANY_ID, в котором хранится текущая компания, выбранная пользователем, и после того, как пользователь удалился из компании, оказывается, что текущая выбранная компания больше не может быть выбрана. , И мне нужен способ понять, что состояние текущего пользователя было изменено, и мне нужно обновить выбранную компанию, хранящуюся в кэше.

Я сделал это следующим образом: я создал компоненты с помощью запроса USER_COMPANY_LIST, который при обновлении списка компаний проверяет текущую выбранную компанию, т. Е. Оказывается, что компонент не отображает никакого представления, а выполняет бизнес-логику. Как это:

export default () => (<Query query={GET_USER_COMPANIES}>{({ client, loading, data:{ companies } }) => {
  if(loading) return null;
  checkSelectedCompanyId(client.cache, companies);
  return null;
}}</Query>)

 function checkSelectedCompanyId(cache, companies) {
  const data = tryReadFromCache(cache, GET_SELECTED_COMPANY_ID);
  if(!data || !data.selectedCompanyId || !companies.some(c => c.id == data.selectedCompanyId)) {
    if(companies.length > 0) {
      cache.writeData({ query: GET_SELECTED_COMPANY_ID, data: { selectedCompanyId:companies[0].id } });
    } else {
      cache.writeData({ query: GET_SELECTED_COMPANY_ID, data: { selectedCompanyId: null } });
    }
  }
}

Это правильный способ написания бизнес-логики в функции рендеринга компонента Query или есть другой способ подписаться на запрос USER_COMPANY_LIST и обновить кэш без использования компонентов?

...