如何将 Redux Store 中的 Props 传递到 Apollo GraphQL 查询中

Posted

技术标签:

【中文标题】如何将 Redux Store 中的 Props 传递到 Apollo GraphQL 查询中【英文标题】:How To Pass Props From Redux Store into Apollo GraphQL Query 【发布时间】:2018-06-03 14:15:35 【问题描述】:

我刚刚开始在一个简单的 React Native 应用程序上使用 Apollo GraphQL,它的功能给我留下了深刻的印象。但我并没有完全理解它是如何与 Redux 商店集成的。本质上,我需要将一些用户输入从我的searchReducer 传递到我的 GraphQL 查询中。我以为我可以简单地将连接的组件传递给我的 GraphQL 查询并提供一个变量,但它没有找到 prop searchInput。代码如下:

import React,  Component  from 'react';
import  FlatList, Text, StyleSheet  from 'react-native';
import  connect  from 'react-redux';
import Repository from './Repository';
import  graphql  from 'react-apollo';
import gql from 'graphql-tag';

const query = gql`
    query repositoryOwner($login: String!) 
        repositoryOwner(login: $login) 
            url,
            avatarUrl(size: 100),
            repositories(first: 5) 
                nodes 
                    name,
                    description
                
            
        
    `;

class RepositoryList extends Component 

    renderItem = ( item ) => 
        return <Repository name=item.name description=item.description />;
    

    render() 

        const  repositoryOwner  = this.props.data;
        const data = repositoryOwner ? repositoryOwner.repositories.nodes : [];

        return (
            <FlatList data=data
                renderItem=(repo) => this.renderItem(repo) keyExtractor=(item, index) => index />
        );
    


const mapStateToProps = (state) => 

    return 
        search: state.searchReducer
    ;
;

const withStore = connect(mapStateToProps)(RepositoryList);

export default graphql(query, 
    options: ( search:  searchInput ) => ( variables:  login: searchInput )
)(withStore);

我以为通过connected React 组件,它会找到mapStateToProps 指定的search prop。但是,它给出了:

TypeError: undefined is not an object(评估 _ref3.search.searchInput)。

显然它没有找到prop。我的问题是,使用 Redux 商店中的 props 作为 Apollo GraphQL 连接组件中的变量的惯用方式是什么?

【问题讨论】:

先在组件上使用graphql,再连接。这种方式连接道具将被注入到查询包装器中。 这似乎行得通!谢谢您的帮助。我的一个担忧是我尝试使用 Apollo 的 compose API:apollographql.com/docs/react/basics/setup.html#compose,但它似乎没有使用 props。一直抱怨无法将类调用为函数。关于正确使用compose 有什么想法吗? 【参考方案1】:

要创建更详细且对其他用户有用的答案:

要使用来自 redux connect 高阶组件的道具,请确保最后应用该函数。这可以在您的示例中通过

const WithGraphql = graphql(/* ... */)(RepositoryList);

export default connect(mapStateToProps)(WithGraphql);

您也可以使用 reduxreact-apollo 中的 compose。 Compose 从最后到第一个应用函数。对于两个参数,compose 可以写成如下:

compose = (f, g) => (...args) => f(g(...args))

确保先在此处列出连接,然后再列出 graphql。这将创建一个新函数,然后您必须将其应用于您的组件RepositoryList

export default compose(
  connect(mapStateToProps),
  graphql(/* ... */),
)(RepositoryList); 

【讨论】:

就在@Herku。对我来说就像一个魅力。我想我将connect 第二次传递到我的compose 中,这把事情搞砸了。感谢您花时间写一个深思熟虑的答案! 感谢您的解决方法!但这看起来确实是一个错误,所以我还打开了一个问题 here。

以上是关于如何将 Redux Store 中的 Props 传递到 Apollo GraphQL 查询中的主要内容,如果未能解决你的问题,请参考以下文章

React 类组件和 React 功能组件更改 redux store 后访问 props 的区别

如何使用带 Redux 的连接从 this.props 获得简单的调度?

如何在 React 中使用 Redux Store 和 GraphQl 进行查询

react 中的 redux 和react-redux的区别分析

redux crateStore connect

在 react js 功能组件中调度操作后如何立即在 redux store 中使用更新的值