首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何动态控制react apollo-client查询启动?

如何动态控制react apollo-client查询启动?
EN

Stack Overflow用户
提问于 2016-10-28 09:53:30
回答 2查看 3.8K关注 0票数 17

包装了apollo-client查询的react组件将自动发起对服务器的数据调用。

我想只在特定的用户输入上发出数据请求。

You can pass the skip option in the query options -但这意味着refetch()函数不是作为组件的道具提供的;而且在道具更新时,似乎不会动态地评估skip的值。

我的用例是map组件。我只想在用户按下按钮时加载标记的数据,而不是在初始组件安装或位置更改时加载。

下面是一个代码示例:

代码语言:javascript
复制
// GraphQL wrapping
Explore = graphql(RoutesWithinQuery, {
  options: ({ displayedMapRegion }) => ({
    variables: {
      scope: 'WITHIN',
      targetRegion: mapRegionToGeoRegionInputType(displayedMapRegion)
    },
    skip: ({ targetResource, searchIsAllowedForMapArea }) => {
      const skip = Boolean(!searchIsAllowedForMapArea || targetResource != 'ROUTE');
      return skip;
    },
  }),
  props: ({ ownProps, data: { loading, viewer, refetch }}) => ({
    routes: viewer && viewer.routes ? viewer.routes : [],
    refetch,
    loading
  })
})(Explore);
EN

回答 2

Stack Overflow用户

发布于 2017-08-24 07:38:14

要包含基于受属性更改影响的条件的HoC,您可以使用recompose中的branch

代码语言:javascript
复制
branch(
  test: (props: Object) => boolean,
  left: HigherOrderComponent,
  right: ?HigherOrderComponent
): HigherOrderComponent

查看:https://github.com/acdlite/recompose/blob/master/docs/API.md#branch

对于此特定示例,将如下所示:

代码语言:javascript
复制
const enhance = compose(
  branch(

    // evaluate condition

    ({ targetResource, searchIsAllowedForMapArea }) =>
      Boolean(!searchIsAllowedForMapArea || targetResource != 'ROUTE'),

    // HoC if condition is true

    graphql(RoutesWithinQuery, {
      options: ({ displayedMapRegion }) => ({
        variables: {
          scope: 'WITHIN',
          targetRegion: mapRegionToGeoRegionInputType(displayedMapRegion)
        },
      }),
      props: ({ ownProps, data: { loading, viewer, refetch } }) => ({
        routes: viewer && viewer.routes ? viewer.routes : [],
        refetch,
        loading
      })
    })
  )
);

Explore = enhance(Explore);
票数 4
EN

Stack Overflow用户

发布于 2017-11-19 18:45:12

我有一个类似的用例,我想只在用户单击时加载数据。

对于by pencilcheck above,我没有尝试过withQuery的建议。但我在其他地方也看到了同样的建议。我将尝试它,但在此期间,这就是我如何让它工作的based off a discussion on github

./loadQuery.js

注意:我使用的是跳过指令:

代码语言:javascript
复制
const LOAD = `
query Load($ids:[String], $skip: Boolean = false) {
  things(ids: $ids) @skip(if: $skip) {
     title
  }
`

LoadMoreButtonWithQuery.js

在这里,我使用withState高阶函数添加一个标志和一个标志设置器来控制skip

代码语言:javascript
复制
import { graphql, compose } from 'react-apollo';
import { withState } from 'recompose';
import LoadMoreButton from './LoadMoreButton';
import LOAD from './loadQuery';

export default compose(
    withState('isSkipRequest', 'setSkipRequest', true),
    graphql(
      gql(LOAD),
      {
        name: 'handleLoad',
        options: ({ids, isSkipRequest}) => ({
          variables: {
            ids,
            skip: isSkipRequest
          },
        })
      }
    ),
)(Button);

./LoadMoreButton.js

在这里,我必须手动“翻转”使用withState添加的标志

代码语言:javascript
复制
export default props => (
    <Button onClick={
        () => {
            props.setSkipRequest(false); // setter added by withState
            props.handleLoad.refetch();
        }
     }>+</Button>
);

坦率地说,我对此有点不满意,因为它引入了一组新的连接(由“withState”组成)。它也没有经过实战测试--我只是让它正常工作,我来StackOverflow是为了寻找更好的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40296800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档