Принудительное выполнение локальных резольверов при повторном рендеринге в клиенте Apollo - PullRequest
0 голосов
/ 06 апреля 2020

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

Заранее спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...