Я пытаюсь использовать локальные средства распознавания в моем приложении реагирования для абстрагирования кэша и логики c от своих компонентов, однако я не вижу реактивности, которую я ожидал, когда мои средства распознавания записывают и обновляют кэш. Например, у меня есть мутация в локальном преобразователе, которая изменяет диапазон дат графика:
Mutation: {
addWeekOffsetToChallengeGraph: (
_root,
{ weekOffset },
{ cache, client }
) => {
const { userId } = cache.readQuery({
query: GET_USER_ID,
});
const { createdAt } = cache.readFragment({
id: userId,
fragment: GET_USER_START_DATE,
});
let data = cache.readFragment({
id: 'LocalChallengeGraph',
fragment: GET_CHALLENGE_GRAPH_FROM_DATE,
});
const { fromDate } = data;
if (
(moment(fromDate)
.add(weekOffset, 'week')
.isSameOrAfter(moment()) &&
weekOffset > 0) ||
(moment(fromDate).isSameOrBefore(createdAt) && weekOffset < 0)
) {
return data;
}
data['fromDate'] = moment(fromDate)
.add(weekOffset, 'week')
.startOf('week')
.format('YYYY-MM-DD')
.toString();
cache.writeFragment({
id: 'LocalChallengeGraph',
fragment: GET_CHALLENGE_GRAPH_FROM_DATE,
data: data,
});
return data;
},
},
, который работает отлично, и фактически я вижу обновления в кеше и перерисовку моего компонента, однако другие мои локальные средства распознавания, использующие директиву @client(always: true)
, не работают. Эти поля имеют распознаватели, которые запрашивают диапазон дат из кэша (который теперь обновляется), чтобы вычислить их значения. Вот взгляд на запрос:
const GET_CHALLENGE_GRAPH = gql`
query challengeGraph {
challengeGraph @client(always: true) {
fromDate @client(always: true)
weekDailyChallengeCompletion @client(always: true) {
activeWeek @client(always: true)
totalWeekChallengesCompleted @client(always: true)
}
peakChallengeUserStat @client(always: true) {
date
completed_challenges
}
totalChallengesCompleted @client(always: true)
}
}
`;
const { data } = useQuery(GET_CHALLENGE_GRAPH);
Насколько я могу судить, клиент apollo просто повторно выполняет рендеринг компонента и получает значения из кэша вместо вызова распознавателя, несмотря на always:true
быть на. Я пробовал разные вещи, такие как использование refetch в мутации likeso:
addWeekOffset({ variables: { weekOffset: -1 } refetchQueries: ['challengeGraph]});
, а также изменение fetch-policy
на no-cache
и даже даже ручное удаление кусочки из кеша до моей мутации. Ничто не заставило эти преобразователи вызываться вне первоначального рендера в моем функциональном компоненте реакции.
Заранее спасибо за помощь!