Кэш клиента apollo обновляется, а пользовательский интерфейс — нет

Мое приложение делает глубокий запрос для получения объекта path по идентификатору и передает результаты через различные реквизиты реакции. Среди прочего, path имеет список steps. Мутация может добавить дополнительные step в список path.steps.

Я делаю мутацию, а затем обновляю кеш. После этого я могу проверить кеш InMemoryCache и увидеть, что элемент действительно был добавлен. Я не получаю предупреждений. Вот как выглядит соответствующий кусок

const { steps } = cache.readFragment({
  id: `Path:${pathId}`,
  fragment: PathLogFragment,
  fragmentName: 'PathLogFragment'
})
cache.writeFragment({
  id: `Path:${pathId}`,
  fragment: PathLogFragment,
  fragmentName: 'PathLogFragment',
  data: { __typename: 'Path', steps: [...steps, addStep] }
})

Теперь у меня есть один компонент, который потребляет шаги и не обновляется. Это довольно просто, с steps.map(s => <li>step</li>). Называется так: {path.steps && <Steps steps={path.steps} />}

Есть реквизиты рендеринга, участвующие в получении path и его перемещении, и есть PureComponents на подходе, но нет вызовов shouldComponentUpdate.

Я в растерянности. Что еще я могу проверить?


person bebbi    schedule 15.05.2018    source источник
comment
не могли бы вы показать, как вы визуализируете свой компонент.   -  person kaushik94    schedule 15.05.2018
comment
Если вы используете readFragment для предоставления данных запроса вашему компоненту, ваш компонент не будет обновляться при изменении кеша, потому что он разработан как одноразовый метод доступа для чтения и не создает наблюдаемый запрос. Подробнее см. в этом ответе: stackoverflow.com/a/50349323/6024220   -  person Daniel Rearden    schedule 15.05.2018
comment
Спасибо! Отличная информация. Что для меня все еще неправдоподобно, так это то, что у меня есть <Query/>, связанный с корневым запросом, который включает в себя полный набор выбора, включая все рассматриваемые реквизиты, которые не обновляются. Итак, в дополнение к вашему другому ответу, что запросы (даже если они не опрашиваются) реагируют на обновления кэша, почему мой корневой запрос не обновляет реактивно реквизиты после изменения writeFragment и не дает обновления моих нижестоящих компонентов?   -  person bebbi    schedule 15.05.2018
comment
writeFragment обновляет только этот конкретный ключ в кеше, но не обновляет ни один из запросов, которые фактически его сгенерировали. Поскольку запрос, который использует ваш компонент Query, не изменен, он не вызывает обновления ни для каких наблюдателей, подписавшихся на него. В документах специально указано использование writeQuery, а не writeFragment при обновлении кеша после мутации.   -  person Daniel Rearden    schedule 16.05.2018
comment
Конечно... спасибо, приму ответ, это очень полезно.   -  person bebbi    schedule 16.05.2018