我们正在使用react-apollo
,它是我们项目中的graphql HOC
。另外,我们正在使用PureComponent
中的react
,以确保父级每次重新渲染时,如果未更改子级props
,也不会导致子级组件的重新渲染。为了在apollo cache
中进行读写,我们使用apollo client
。
graphql HOC
与一个组件挂钩,可以从服务器检索数据,并将其存储到缓存中。而且我们希望将部分数据从缓存中提供给后代组件。
让我们举个例子。在祖先级别,我们从服务器获取项目列表。在子级,我们需要apollo商店中已经存在的特定商品的详细信息。
要执行相同的操作,可以使用三种方法:
- 将数据作为道具传递给后代组件。
render(){
return (
<ListComponent list={this.props.list}/>
)
}
render(){
return (
<ItemComponent list={this.props.list} selectedItem={"1"}/>
)
}
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
的{{1}}函数。
readFragment
这三种方法也有相关的利弊。
第一种方法在每种情况下都有效。唯一的问题是我们通过不必要的道具自上而下传递数据。
第二种方法在每种情况下都有效。唯一的问题是我们必须不必要地挂钩查询来访问缓存。
第三种方法看起来很干净,但是唯一的问题是更新render(){
const item = client.readFragment({
id:`List:${this.props.selectedItem}`
fragment:"ListFragment"
});
return (
<div>{this.props.item}</div>
)
}
时组件不会重新渲染,因为我们使用了apollo cache
。
我对这三种方法感到困惑。因此,如果您可以提供我应该使用哪种方法的见解,或者可以提供任何其他混合方法,那么将对您有很大的帮助。