标签: react-apollo

Apollo 客户端延迟刷新

Apollo Client v3React 实现中,我使用钩子来使用订阅。当我从订阅接收数据时,我想重新获取查询,但前提是查询之前已执行过并且位于缓存中。有办法实现这一点吗?

我首先进行惰性查询,然后在收到订阅数据时手动检查缓存,然后尝试执行惰性查询并重新获取。它可以工作,但只是感觉很笨重......

export const useMyStuffLazyRefetch = () => {
    const [refetchNeeded, setRefetchNeeded] = useState<boolean>(false);
    const client = useApolloClient();
    const [getMyStuff, { data, refetch }] = useLazyQuery<IStuffData>(GET_MY_STUFF);

    useEffect(() => {
        if (refetchNeeded) {
            setRefetchNeeded(false);
            refetch();
        }
    }, [refetchNeeded]);

    const refetchIfNeeded = async () => {
        const stuffData = client.cache.readQuery<IStuffData>({ query: GET_MY_STUFF });
        if (!stuffData?.myStuff?.length) return;
        getMyStuff();
        setRefetchNeeded(true);
    }

    return {
        refetchIfNeeded: refetchIfNeeded
    };
}
Run Code Online (Sandbox Code Playgroud)

reactjs graphql react-apollo apollo-client

5
推荐指数
1
解决办法
1万
查看次数

Apollo 客户端 3:查询在 Chrome 的“网络”选项卡中返回结果,但在我的应用程序中未定义

我正在使用 v3 获取一些数据@apollo/client。在Chrome的网络选项卡(http结果)中,我可以看到它返回数据和错误(我并不担心该错误,我现在知道为什么会这样。):

\n
{\n    data: {workItems: [,\xe2\x80\xa6]},\xe2\x80\xa6},\n    errors: [{message: "Error trying to resolve position."\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是在我的应用程序中,data返回未定义。

\n

这是我的客户端配置:

\n
export const graphqlClient = new ApolloClient({\n    cache: new InMemoryCache(),\n    link: ApolloLink.from([\n        onError(({ graphQLErrors, networkError }) => {\n            if (graphQLErrors) {\n                graphQLErrors.forEach(error =>\n                    console.log(\n                        `[GraphQL error]: ${JSON.stringify(error, null, 2)}`\n                    )\n                )\n            }\n            if (networkError) {\n                console.log(`[Network error]: ${networkError}`)\n            }\n        }),\n        apolloLink\n    ])\n})\n
Run Code Online (Sandbox Code Playgroud)\n

我的查询:

\n
gql`\n    query WorkItems($ppm: String) {\n        workItems(where: { ppm: $ppm }) {\n            ...WorkItemKanban\n …
Run Code Online (Sandbox Code Playgroud)

react-apollo apollo-client

5
推荐指数
1
解决办法
2053
查看次数

打字稿中的 Apollo 客户端返回类型

我试图在一个返回 Apollo Client 的类中构建一个简单的函数。这是我的代码:

import appConfig from 'config/app-config';
import { ApolloClient, InMemoryCache, createHttpLink } from '@apollo/client';
import LocalStorageKeys from 'constants/local-storage-keys';
import { setContext } from '@apollo/client/link/context';

export class ApolloClientServiceImpl {
  private cache: InMemoryCache;
  constructor() {
    this.cache = new InMemoryCache();
  }

  createApolloClient(idToken: string): unknown {
    const httpLink = createHttpLink({
      uri: appConfig.hasura.url,
    });
    const authLink = setContext((_, { headers }) => {
      let bearerToken = localStorage.getItem(LocalStorageKeys.TOKEN);
      if (idToken) {
        bearerToken = idToken;
      }
      return {
        headers: {
          ...headers,
          authorization: bearerToken ? `Bearer …
Run Code Online (Sandbox Code Playgroud)

typescript apollo react-apollo apollo-client

5
推荐指数
1
解决办法
1558
查看次数

@apollo/client , apollo-client 和 apollo boost 之间的区别

我正在实现 using @apollo/client,但我没有看到任何完整的@apollo/clientwith示例react。如果我搜索,我会得到示例 apollo-clientapollo boost

3个有什么区别。 我理解的@apollo/client都是新版的。我在哪里可以得到完整的例子@apollo/clientreact应用?

import { ApolloClient, InMemoryCache, ApolloLink, createHttpLink, defaultDataIdFromObject } from '@apollo/client';
import { ApolloClient, InMemoryCache, ApolloLink } from 'apollo-boost';
Run Code Online (Sandbox Code Playgroud)

graphql react-apollo apollo-client apollo-boost

5
推荐指数
2
解决办法
1479
查看次数

Apollo 客户端乐观更新是否更改每个列表项的引用?

  1. 我有父组件A从中获取 TODO 列表(假设有 10 个项目),然后映射此数组并将整个对象传递给组件B

  2. 组件B有一个备忘录包装器来比较todo对象引用以仅重新渲染更新的组件。喜欢:

    export default memo(ComponentB, (prevProps, nextProps) => {  
     return prevProps.TODO === nextProps.TODO
    })
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从组件B上的按钮单击调用useMutation以在列表中添加一项。我在Apollo doc上提供了乐观响应更新功能

  4. 一切正常,除了:当我为快速 UI 更改添加optimizeResponse并在组件B 中登录时,我看到每个列表项都在重新渲染,但是如果我只保留更新功能而没有optimizeResponse那么我看到只有一个项目重新渲染- 渲染。

所以我的问题是,Apollo是如何处理乐观响应更新的,还是我应该继续在我的代码中寻找一些问题,并且我已经在尝试计算小时数了:/

我只是找不到任何材料来指出这个特殊情况,如果有人知道答案,也许可以分享链接或小建议。谢谢!

reactjs react-apollo apollo-client

5
推荐指数
1
解决办法
168
查看次数

Apollo MockedProvider 未返回预期数据

我写了一个调用 apollo 的钩子useQuery。这很简单:

使用决策者:

import { useState } from 'react';
import { useQuery, gql } from '@apollo/client';

export const GET_DECIDER = gql`
  query GetDecider($name: [String]!) {
    deciders(names: $name) {
      decision
      name
      value
    }
  }
`;

export const useDecider = name => {
  const [enabled, setEnabled] = useState(false);

  useQuery(GET_DECIDER, {
    variables: {
      name
    },
    onCompleted: data => {
      const decision = data?.deciders[0]?.decision;
      setEnabled(decision);
    },

    onError: error => {
      return error;
    }
  });

  return {
    enabled
  };
};
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试测试它,但MockedProvider …

javascript apollo reactjs react-apollo apollo-client

5
推荐指数
2
解决办法
7714
查看次数

在中继分页graphql上滚动时合并以前的数据

我正在尝试使用中继样式分页。但是,我在无限滚动时遇到了麻烦。当我滚动或加载下一组数据时,我只会获取当前数据,而不会将其合并到先前的数据中。这就是我所做的

缓存文件

import { InMemoryCache } from '@apollo/client';
import { relayStylePagination } from '@apollo/client/utilities';

const cache = new InMemoryCache({
  typePolicies: {
    Query: {
      fields: {
        conversation: relayStylePagination(),
      },
    },
  },
});

export default cache;
Run Code Online (Sandbox Code Playgroud)

会话查询

就我而言,像 first、after、before、last 这样的参数都在 params 对象内

export const CONVERSATION = gql`
  query conversation($channel: ShortId, $contact: ShortId, $params: ConnectionInput) {
    conversation(channel: $channel, contact: $contact, params: $params) {
      status
      data {
        pageInfo {
          ...PageInfo
        }
        edges {
          cursor
          node {
            ...Communication
          }
        }
      }
    }
  }
  ${PAGE_INFO}
  ${COMMUNICATION} …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs graphql react-apollo apollo-client

5
推荐指数
1
解决办法
169
查看次数

Apollo 客户端 MockedProvider:跳过加载状态

我使用 Apollo 设置了一个 React 应用程序,以拥有一个处理从网络加载数据的包装器组件,以便下面的每个组件都可以直接从 Apollo 缓存查询数据,而不必担心处理加载状态。因此,我的组件如下所示:

export const COUNT_OFF_ADAPTER_QUERY = gql`
  query CountOffAdapterQuery($vampId: ID!) {
    vamp(id: $vampId) @client {
      id
      countingOff
      countingOffStartTime
    }
  }
`;

export const CountOffAdapter: React.FC<{}> = () => {
  const vampId = useCurrentVampId();

  const {
    data: {
      vamp: { countingOff, countingOffStartTime }
    }
  } = useQuery<CountOffAdapterQuery>(COUNT_OFF_ADAPTER_QUERY, {
    variables: { vampId }
  });

  const prev = usePrevious({ countingOff, countingOffStartTime });

  const countOff = useCountOff();

  useEffect(() => {
    // Do react stuff
  }, [countOff, countingOff, prev]);

  return …
Run Code Online (Sandbox Code Playgroud)

typescript apollo react-apollo apollo-client

5
推荐指数
1
解决办法
1382
查看次数

Apollo GraphQL 客户端 + Next.JS 错误处理

该组件很好地呈现了错误状态,但异常在控制台中显示为未捕获,并且在浏览器的下一个开发中显示对话框。有没有办法处理预期错误来抑制这种行为?

import { useMutation, gql } from "@apollo/client";
import { useEffect } from "react";

const CONSUME_MAGIC_LINK = gql`
  mutation ConsumeMagicLink($token: String!) {
    consumeMagicLink(token: $token) {
      token
      member {
        id
      }
    }
  }
`;

export default function ConsumeMagicLink({ token }) {
  const [consumeMagicLink, { data, loading, error }] =
    useMutation(CONSUME_MAGIC_LINK);

  console.log("DATA", data, "loading:", loading, "error:", error);

  useEffect(() => {
    try {
      consumeMagicLink({ variables: { token } });
    } catch (e) {
      console.log(e);
    }
  }, []);

  var text = "Link has expired …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs react-apollo next.js apollo-client

5
推荐指数
1
解决办法
3262
查看次数

apollo-server-micro:响应缺少标头“access-control-allow-methods:POST”

在我的next.js应用程序中,我尝试配置 Apollo 端点:

import { ApolloServer, gql } from "apollo-server-micro";

// This data will be returned by our test endpoint. Not sure if I need id? https://apuyou.io/blog/serverless-graphql-apollo-server-nextjs
const tacos = {
  meat: [
    {
      type: 'Al Pastor',
      imgURL: 'https://hips.hearstapps.com/hmg-prod.s3.amazonaws.com/images/190130-tacos-al-pastor-horizontal-1-1549571422.png?crop=0.668xw:1.00xh;0.175xw,0&resize=480:*'
    },
    {
      type: 'Barbacoa',
      imgURL: 'https://i2.wp.com/www.downshiftology.com/wp-content/uploads/2021/02/Barbacoa-Tacos-3.jpg'
    },
    {
      type: 'Chorizo',
      imgURL: 'https://www.seriouseats.com/thmb/-8LIIIObcZMUBy-9gXlMsHcaeMI=/610x458/filters:fill(auto,1)/__opt__aboutcom__coeus__resources__content_migration__serious_eats__seriouseats.com__recipes__images__2014__04__20140428-sloppy-joe-chorizo-taco-recipe-food-lab-lite-8-503212a07b0a4d499952ff40aed57694.jpg'
    },
  ],
  fish: [
    {
      type: 'Camaron',
      imgURL: 'https://juegoscocinarpasteleria.org/wp-content/uploads/2019/07/1563435179_315_Tacos-De-Camarones-Con-Crema-De-Cal-Y-Cilantro.jpg'
    },
    {
      type: 'Salmon',
      imgURL: 'https://www.cookingclassy.com/wp-content/uploads/2015/04/salmon-tacos-with-avocado-salsa4-srgb..jpg'
    },
    {
      type: 'Pulpo',
      imgURL: 'https://images.squarespace-cdn.com/content/v1/5710a8b3e707ebb8c58fea2c/1590075315244-QNXQE1LGPH06HV3EDF6B/tacos_34.jpg?format=1000w'
    },
  ],
  veggi: [
    {
      type: …
Run Code Online (Sandbox Code Playgroud)

apollo apollo-server react-apollo next.js

5
推荐指数
1
解决办法
2942
查看次数