【发布时间】:2018-09-09 21:50:39
【问题描述】:
假设我有以下 React 组件:
import { Query } from 'react-apollo'
const MovieListContainer = () => (
<Query query={QUERY}>
{
({ loading, error, data }) => {
if (loading) return (<p>Loading...</p>)
if (error && !data) return (<p>Error...</p>)
return <MovieList movies={ data.movies }
}
}
</Query>
)
本质上,这用于从 GraphQL 缓存中获取电影列表(必要时访问服务器)以显示。我想尽量减少用户看到“正在加载”屏幕的时间,所以在初始化我的应用程序时我可能会这样做:
import { MOVIE_QUERY } from './queries'
const client = new ApolloClient({
uri: 'http://example.com:3000/graphql'
})
// Query the movies immediately, and refresh every 30 seconds
client.query({ query: MOVIE_QUERY })
client.watchQuery({query: MOVIE_QUERY }, pollInterval: 30000)
const App = () => (
<ApolloProvider client={client}>
<Layout />
</ApolloProvider>
)
这很好用。问题是,现在假设我想制作另一个组件来显示列表中的电影数量....
const MovieTab = ({ count }) => {
<Tab>
<span>Movies</span>
<Badge>{ count }</Badge>
</Tab>
}
如何创建一个容器来将MovieTab 连接到 Apollo 缓存以获取电影列表而不会导致数据库命中(如果需要,在徽章中显示“??”)?我尝试过的一些事情:
- 将其包装在
Query中,其中查询类似于movies { id }。我已将此作为答案发布,但我仍然对此并不着迷。 - 将其包装在
Query中,其中查询为MOVIE_QUERY。似乎与使用 GraphQL 仅获取所需数据的想法背道而驰。 - 将其包装在 ApolloConsumer 中以访问客户端,然后调用
readQuery以获取电影列表。这保证了我不会访问数据库,但在缓存实际填满数据之前不会工作。
【问题讨论】:
标签: javascript react-apollo apollo-client