如何将道具从Redux商店传递到Apollo GraphQL查询

问题描述 投票:2回答:1

我刚刚在一个简单的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);

我认为通过传递qazxswwied React组件,它会找到由connect指定的search prop。但是,它给出了:

TypeError:undefined不是对象(评估_ref3.search.searchInput)。

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

react-native graphql react-apollo apollo-client
1个回答
5
投票

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

要使用redux props更高阶组件中的props,请确保最后应用该函数。这可以在你的例子中完成

connect

或者,您可以使用redux或react-apollo中的const WithGraphql = graphql(/* ... */)(RepositoryList); export default connect(mapStateToProps)(WithGraphql); 。 Compose应用从last到first的函数。对于两个参数,compose可以写成如下:

compose

确保首先列出连接,然后列出graphql。这将创建一个新函数,然后您必须将其应用于组件compose = (f, g) => (...args) => f(g(...args))

RepositoryList
© www.soinside.com 2019 - 2024. All rights reserved.