【问题标题】:React Apollo 错误:不变违规:在上下文中找不到“客户端”或作为选项传入
【发布时间】:2020-02-16 22:08:06
【问题描述】:

我正在使用 React、Apollo 和 Next.js 构建一个项目。我正在尝试将 react-apollo 更新到 3.1.3,现在查看站点时出现以下错误。

不变违规:在上下文中找不到“客户端”或作为选项传入。将根组件包裹在一个 中,或者通过选项传入一个 ApolloClient 实例。

如果我将 react-apollo 包降级到 2.5.8,它可以正常工作,所以我认为 2.5 和 3.x 之间发生了一些变化,但在 react-apollo 或 next-with-apollo 中找不到任何东西文档以表明可能是什么。任何帮助将不胜感激。

withData.js

import withApollo from 'next-with-apollo';
import ApolloClient from 'apollo-boost';
import { endpoint } from '../config';

function createClient({ headers }) {
    return new ApolloClient({
        uri: endpoint,
        request: operation => {
            operation.setContext({
                fetchOptions: {
                    credentials: 'include'
                },
                headers
            });
        },
        // local data
        clientState: {
            resolvers: {
                Mutation: {}
            },
            defaults: {}
        }
    });
}

export default withApollo(createClient);

_app.js

import App from 'next/app';
import { ApolloProvider } from 'react-apollo';
import Page from '../components/Page';
import { Overlay } from '../components/styles/Overlay';
import withData from '../lib/withData';

class MyApp extends App {
    static async getInitialProps({ Component, ctx }) {
        let pageProps = {};
        if (Component.getInitialProps) {
            pageProps = await Component.getInitialProps(ctx);
        }

        // this exposes the query to the user
        pageProps.query = ctx.query;
        return { pageProps };
    }

    render() {
        const { Component, apollo, pageProps } = this.props;

        return (
            <ApolloProvider client={apollo}>
                <Overlay id="page-overlay" />
                <Page>
                    <Component {...pageProps} />
                </Page>
            </ApolloProvider>
        );
    }
}

export default withData(MyApp);

【问题讨论】:

    标签: reactjs graphql apollo next.js


    【解决方案1】:

    就我而言,我发现我安装了react-apollo@3.0.1 以及@apollo/react-hooks@3.0.0。删除 @apollo/react-hooks 并仅依靠 react-apollo 为我解决了不变的问题。确保您没有在锁定文件或package.json中使用任何不匹配的版本@

    这是有人在 GitHub 问题线程中所说的,我也是这样。请务必尝试一下!

    【讨论】:

    • 还有react-apollo-hooks vs @apollo/react-hooks——你想要后者,小心!
    • 对我来说类似的情况-我一直从 react-apollo 导入 ApolloProvider,但从 @apollo/react-hooks 导入 useQuery。从 @apollo/react-hooks 导入 ApolloProvider 为我解决了这个问题。
    • @DannyRosenblatt 对我来说也是如此,我认为大多数在线教程都遵循从“react-apollo”而不是@apollo/react-hooks 导入 ApolloProvider 的方法。跨度>
    • apollo v2 的文档很糟糕——如果你想使用 react 组件而不是钩子,你需要手动安装 @apollo/react-components 并从那里导入所有内容。它并没有在任何地方说,必须努力弄清楚。
    【解决方案2】:

    我发现这也是解决方案,尽管现在我只使用 @apollo/clientapollo-link,因为它们是最新版本。

    【讨论】:

    • 你找到了解决办法吗?
    【解决方案3】:

    我有多种解决方案,我认为这确实归结为您最初设置所有相关软件包的方式。

    “在将客户端连接到 Reacts Context.Provider 时,某些包不能与其他包很好地配合使用”

    我已经进行了两次似乎运行良好的修复(新项目和更新旧项目):

    1:卸载@apollo/react-hooks

    然后:

    import { ApolloProvider } from "@apollo/client";
    

    代替:

    import { ApolloProvider } from "react-apollo";
    

    (这让我可以无冲突地保留“@apollo/react-hooks”包)

    3:仔细检查服务HttpLink 客户端URI 的服务器是否已启动并正在运行以供客户端连接(这给出了一个与刚才讨论的不同的错误,但仍然很高兴知道这一点情况)

    结论:可能会有点试错,但尽量使用匹配/配对包

    【讨论】:

      【解决方案4】:

      我卸载了“react-apollo”,改用“@apollo/client”,它为我解决了这个问题。

      【讨论】:

        【解决方案5】:
        import gql from 'graphql-tag';
        import {graphql} from '@apollo/react-hoc';
        import { ApolloClient, InMemoryCache } from '@apollo/client';
        import { ApolloProvider } from '@apollo/react-hooks';
        

        这些导入非常适合我。我在调试和寻找不同的导入库时度过了愉快的时光,但最终在 3 小时后,这是使用 graphql 和 appolo 的解决方案。

        【讨论】:

          【解决方案6】:

          从 'apollo/client' 导入 {ApolloProvider} 而不是 'react-apollo' 或 '@apollo/react-hooks'

          【讨论】:

            猜你喜欢
            • 2020-03-13
            • 2021-06-25
            • 2020-02-18
            • 2021-04-19
            • 1970-01-01
            • 2021-04-14
            • 2016-04-30
            • 2020-04-25
            • 2021-02-13
            相关资源
            最近更新 更多