javascript - 无需访问服务器即可获取缓存数据的计数

标签 javascript react-apollo apollo-client

假设我有以下 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 缓存以获取电影列表,而不会导致数据库命中(如有必要,在徽章中显示“??”)?我尝试过的一些事情:

  • 将其包装在查询中,其中查询类似于movies { id }。我已将此作为答案发布,但我仍然不喜欢它。
  • 将其包装在查询中,其中查询为MOVIE_QUERY。似乎违背了使用 GraphQL 只获取所需数据的想法。
  • 将其包装在 ApolloConsumer 中以访问客户端,然后调用 readQuery 来获取电影列表。这保证了我不会访问数据库,但在缓存实际充满数据之前不会工作。

最佳答案

这是我目前的做法:

const QUERY = gql`
movies { id }
`

const MovieTabContainer = () => (
  <Query query={ QUERY } fetchPolicy='cache-only'>
    ({ data }) => {
      const count = data.movies ? data.movies.length : '??'
      return (
        <MovieTab count={ count } />
      )
    }
  </Query>
)

通过指定获取策略仅缓存,我们将立即传递数据(这将是一个空对象)。我们可以将此视为我们还不知道计数的迹象。一旦通过执行完整电影查询填充了缓存,MovieTab 组件将重新呈现以包含实际长度。

关于javascript - 无需访问服务器即可获取缓存数据的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49581457/

相关文章:

reactjs - 如何使用 react-apollo 使用相同的查询进行多个 graphql 查询?

graphql - Apollo 更新查询未调用?

javascript - chart.js,每次更新后,避免滚动到顶部位置

javascript - 如何设置 cloud9-ide 以引用其他 Javascript 文件?

node.js - 如何从 apollo 服务器发送错误消息

graphql - Apollo GraphQL (React) 跨组件数据共享

mocking - 当组件有多个 useQuery 时,Apollo MockedProvider 不起作用?

express - 无法在 Next.js 应用程序 : POST body missing 中使用 Apollo-client GraphQL 上传文件

javascript - 移动菜单按钮不可点击

javascript - 从 updatepanel 获取 JavaScript/jQuery 中的隐藏字段值