Я использую <Query>
клиента Apollo в компоненте, который повторно отображается при изменении состояния в рамках метода жизненного цикла. Я хочу, чтобы мой <Query>
компонент повторно выполнял запрос, потому что я знаю, что данные изменились. Похоже, что компонент запроса использует кеш, который необходимо сделать недействительным перед повторным запуском запроса.
Я использую неудобный обходной путь, который кэширует обратный вызов refetch
из опоры рендеринга в родительском компоненте, но это кажется неправильным. Опубликую свой подход в ответах, если кому интересно.
Мой код выглядит примерно так. Я удалил обработку loading
и error
из запроса, а также некоторые другие детали для краткости.
class ParentComponent extends React.Component {
componentDidUpdate(prevProps) {
if (this.props.refetchId !== prevProps.refetchId) {
const otherData = this.processData() // do something
this.setState({otherData}) // this forces component to reload
}
}
render() {
const { otherData } = this.state
return (
<Query query={MY_QUERY}>
{({ data }) => {
return <ChildComponent gqlData={data} stateData={otherData} />
}}
</Query>
)
}
}
Как заставить <Query>
получать новые данные для передачи <ChildComponent>
?
Несмотря на то, что ParentComponent
повторно визуализируется при изменении свойств или состояния, Query
не запускается повторно. ChildComponent
получает обновленную stateData
опору, но имеет устаревшую gqlData
опору. Насколько я понимаю, кеш запросов Apollo необходимо сделать недействительным, но я не уверен.
Обратите внимание, что передача refetch
в ChildComponent не является ответом, потому что он отображает только информацию из GraphQL и не знает, когда выполнять повторную выборку. Я не хочу вводить таймеры или иным образом усложнять ChildComponent
решение этой проблемы - ему не нужно знать об этой сложности или проблемах с извлечением данных.