使用 react-apollo 的 client.query 响应更新商店以实现搜索栏功能

Updating store with the response from client.query with react-apollo for a searchbar function

我有一个 Graphcool 后端,我想在按下按钮时搜索它。据我了解:如果我使用来自 react-apollo 的 graphql 容器,组件将在安装后立即进行查询。

这不是我想要的。我打算仅在按下按钮时进行搜索。我知道 withApollo 容器允许我进行如下查询:

this.props.client.query({
        query: MY_QUERY,
        variables: {
            first, // for pagination
            skip,
            orderBy,
            searchText
        }
    }); // returns a promise

我的问题:如何使用 returns 的响应更新商店?我是不是用错了方法?

所以我意识到我的做法是错误的。我发现这很有帮助 post:search feature with react-apollo

我会更简单地拥有状态,然后用这样的响应更新所述状态:

this.props.client.query({
    query: MY_QUERY,
    variables: {
        first, // for pagination
        skip,
        orderBy,
        searchText
    },
}).then(result => this.setState({ thingsToRender: result.data.thingsToRender });

那么您当然会通过映射或使用 FlatList 来渲染对象(如果您使用的是 React Native)。

如果我真的想那样做,我还发现了如何更新我的商店。该组件需要被来自 react-apollographqlwithApollo 高阶组件包装才能工作:

compose(
  withApollo,
  graphql(SOME_QUERY)
)(MyComponent)

然后你做一个像这样的方法:

onSearchButtonPress = async () => {
  const { first, skip, orderBy, searchText } = this.state;

  const result = await this.props.client.query({
    query: MY_QUERY,
    variables: {
      first,
      skip,
      orderBy,
      searchText
    }
  });
  const items = result.data.items;
  this.props.data.updateQuery(prev => ({
    ...prev,
    allItems: _.uniqBy([...prev.allItems, ...items], o => o.id)
    // lodash uniqBy helper method helps with removing older items
    // with the same id (essentially updating them)
  });

这几乎就像在 redux reducer 中更新状态。