Я пишу приложение на 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 и обновить кэш без использования компонентов?