【问题标题】:Apollo GraphQL React - how to query on click?Apollo GraphQL React - 如何在点击时进行查询?
【发布时间】:2017-02-10 09:49:18
【问题描述】:

在 Apollo React 文档http://dev.apollodata.com/react/queries.html#basics 中有显示组件时自动获取的示例,但我想在单击按钮时运行查询。我看到了一个在单击按钮时“重新”获取查询的示例,但我不希望它最初查询。我看到有一种方法可以调用突变,但是如何调用查询?

【问题讨论】:

标签: reactjs graphql apollostack


【解决方案1】:

您可以通过使用withApollohigher-order-component 传递对Apollo Client 的引用来实现,如下所述:https://www.apollographql.com/docs/react/api/react-apollo.html#withApollo

然后,您可以在传入的对象上调用client.query,如下所示:

class MyComponent extends React.Component {
  runQuery() {
    this.props.client.query({
      query: gql`...`,
      variables: { ... },
    });
  }

  render() { ... }
}

withApollo(MyComponent);

出于好奇,对点击事件运行查询的目的是什么?也许有更好的方法来实现基本目标。

【讨论】:

  • 我想用这个作为搜索栏
  • 我发现如果我在父组件上有 gql HOC 的组件上使用它,它会触发父组件WillReceiveProps。不知道为什么。有没有更好的办法?也许是 redux。
  • 这个不更新props?为什么?结果成功进来后如何更新props?
  • 你可以定义一个 updateQuery 函数或 updateQueries 对象来更新现有的 props
  • 在 apollo 2.1 中你可以使用 组件 apollographql.com/docs/react/api/…... 还有这个 ---> apollographql.com/docs/react/essentials/…
【解决方案2】:

从 3.0 版开始,您现在可以通过两种方式执行此操作。

client.query

第一种方法是调用ApolloClientquery方法。这将返回一个 Promise,它将解析查询的结果。您可以使用withApollo HOC 获取对客户端的引用:

class MyComponent extends React.Component {
  handleClick() {
    const { data } = await this.props.client.query({
      query: gql`...`,
      variables: { ... },
    })
    ...
  }
  ...
}

withApollo(MyComponent)

或者,您也可以使用ApolloConsumer 获取客户端:

const MyComponent = () => (
  <ApolloConsumer>
    {client => {
      ...
    }
  </ApolloConsumer>
)

useApolloClient 钩子:

const MyComponent = () => {
  const client = useApolloClient()
  ...
}

useLazyQuery

第二种方式是使用useLazyQuery钩子:

const MyComponent = () => {
  const [runQuery, { called, loading, data }] = useLazyQuery(gql`...`)
  const handleClick = () => runQuery({ variables: { ... } })
  ...
}

【讨论】:

  • 当您需要处理订阅时,Hooks 很让人头疼。出错的可能性,在服务器上打开太多订阅频道太高了! useMemo 会有所帮助,但 subscribeToMore 太危险了:)))
  • useLazyQuery 正是我们立即加载所需要的。谢谢。
  • 我必须使用useApolloClient ,因为我有一个帖子列表,并且列表的每一行都有一个编辑按钮。当我单击编辑按钮时,我想通过其 id 获取发布数据并以模式显示数据。我测试了useLazyQuery 它没有再次获得发布数据。我的意思是第二次和第三次,如果不刷新页面,我就无法做到这一点。
  • @FullOfStack 你应该在useLazyQuery 中添加参数fetchPolicy: 'network-only'
猜你喜欢
  • 2016-11-30
  • 2019-12-06
  • 2020-05-13
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2017-09-08
  • 2018-05-08
相关资源
最近更新 更多