Мы используем react-apollo
, и это graphql HOC
в нашем проекте. Кроме того, мы используем PureComponent
из react
, чтобы гарантировать, что при каждом повторном рендеринге родительского элемента он не вызывает повторного рендеринга дочернего компонента, если дочерний props
не изменился. А для чтения и записи в apollo cache
мы используем apollo client
.
graphql HOC
подключен к компоненту для извлечения данных с сервера, и он будет хранить данные в кэше. И мы хотим предоставить некоторую часть этих данных компоненту-потомку из кэша.
Давайте рассмотрим пример. На уровне предка мы получаем список элементов с сервера. И на уровне ребенка, нам нужна деталь конкретного предмета, который уже есть в магазине apollo.
Для того же, есть три возможных способа:
- Передача данных в качестве реквизита дочерним компонентам.
- Вот метод рендеринга Grand Parent Component, где мы получаем список элементов с сервера.
render(){
return (
<ListComponent list={this.props.list}/>
)
}
- Вот метод визуализации компонента List.
render(){
return (
<ItemComponent list={this.props.list} selectedItem={"1"}/>
)
}
- Вот метод визуализации компонента Item.
render(){
const item = this.props.list[this.props.selectedItem]
return (
<div>{this.props.item}</div>
)
}
- Чтобы подключить
graphql HOC
внутри дочернего компонента с fetch-policy
, установленным в cache-first
.
- Вот компонент, куда мы зацепляем
graphql query
, чтобы получить предмет.
class ItemComponent extends React.PureComponent {
render(){
return (
<div>{this.props.item}</div>
)
}
}
export default compose(
graphql(QUERY, {
options: ({id}) => ({
variables: {id}
})
}
)
- Для использования функции
apollo client
readFragment
.
render(){
const item = client.readFragment({
id:`List:${this.props.selectedItem}`
fragment:"ListFragment"
});
return (
<div>{this.props.item}</div>
)
}
Также есть три плюса и минуса с этими тремя подходами.
Первый подход работает хорошо во всех случаях. Единственная проблема - мы передаем данные сверху вниз через ненужные реквизиты.
Второй подход работает хорошо во всех случаях. Единственная проблема заключается в том, что мы должны излишне перехватить запрос для доступа к кешу.
Третий подход выглядит чистым, но единственная проблема заключается в том, что компонент не перерисовывается при обновлении apollo cache
, потому что мы используем PureComponent
.
Я запутался между этими тремя подходами. Поэтому, если вы можете дать представление о том, какой подход мне следует использовать, или если вы можете предоставить какой-либо другой гибридный подход, это было бы очень полезно.