标签: react-apollo

GraphQL 突变后的 updateQueries 不适用于 Apollo 客户端

在我的应用程序中发送createMessage突变后,我想ApolloStore使用updateQueries.

我的设置如下:

const ChatWithAllMessages = graphql(allMessages, {name: 'allMessagesQuery'})(Chat)
export default graphql(createMessage, {
   props({ownProps, mutate}) {
    return {
      createMessageMutation(text, conversationId) {
        return mutate({
          variables: { text, conversationId },
          updateQueries: {
            allConversations: (previousState, {mutationResult}) => {
              console.log('Chat - did send mutation for allConversationsQuery: ', previousState, mutationResult)
              return ...
            }
          }
        })
      }
    }
  }
})(ChatWithAllMessages)
Run Code Online (Sandbox Code Playgroud)

createMessageMutation在代码中这样调用:

_onSend = () => {
  this.props.createMessageMutation(this.state.message, this.props.conversationId)
}
Run Code Online (Sandbox Code Playgroud)

通过此设置,我希望updateQueries执行我在值中指定的函数,但是,这似乎不会发生(日志记录语句永远不会被打印)。

作为参考,查询如下allConversation所示ApolloStore

在此输入图像描述

另外,我的 JS …

javascript apollo graphql apollostack react-apollo

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

在 graphql-ruby 中定义输入类型

我正在尝试使用 graphql-ruby 和 rails 为过滤器实现输入类型。

基本输入类型如下所示:

module Types
  class BaseInputObject < GraphQL::Schema::InputObject
  end
end
Run Code Online (Sandbox Code Playgroud)

我自己的输入类型看起来像:

module Types
    class PhotoFilterType < Types::BaseInputObject
        argument :attribution, String, "Filters by submitter", required: false
        argument :country, String, "Filters by country", required: false
        argument :year, Int, "Filters by year", required: false
    end
end
Run Code Online (Sandbox Code Playgroud)

query_type 的方法标题如下所示:

    field :filtered_photos, [Types::PhotoType], null: true do
      argument :filters, Types::PhotoFilterType, 'filters for photo', required: true
    end
Run Code Online (Sandbox Code Playgroud)

查询如下:

const FILTER_QUERY = gql`
  query getFilteredPhotos($filters: PhotoFilterType!) {
    filteredPhotos(filters: $filters) {
      id
      title
      width
      height …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails graphql react-apollo graphql-ruby

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

设置 AWSAppSyncClient、Apollo 和 React 的正确方法

我在开始使用 React、Apollo 和 AWS-AppSync 时遇到了问题。我无法解决此错误消息:

TypeError: this.currentObservable.query.getCurrentResult is not a function
Run Code Online (Sandbox Code Playgroud)

我正在使用@apollo/react-hooks 和 aws-appsync 的更新包。

我目前的设置看起来像这样。

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

import config from './aws-exports';
import AWSAppSyncClient from 'aws-appsync';
import { ApolloProvider } from '@apollo/react-hooks';

const client = new AWSAppSyncClient({
    url: config.aws_appsync_graphqlEndpoint,
    region: config.aws_appsync_region,
    auth: {
        type: config.aws_appsync_authenticationType,
        apiKey: config.aws_appsync_apiKey
    }
});

ReactDOM.render(
    <ApolloProvider client={client}>
        <React.StrictMode>
            <App />
        </React.StrictMode>
    </ApolloProvider>,
    document.getElementById('root')
);
Run Code Online (Sandbox Code Playgroud)

我有一个函数可以进行如下查询:

import React …
Run Code Online (Sandbox Code Playgroud)

graphql react-apollo apollo-client aws-appsync

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

如何使用 Redux Tool Kit 的“createSlice”设置一个单元测试 Redux?

我正在研究如何使用 Jest 对我们项目的 Redux 代码进行单元测试。我一直在阅读“官方”Redux 建议,但我们的代码与他们引用的 Redux 设置不同,因为我们使用了Redux 工具包(RTK) 和“ createSlice ”,它可以自动执行某些过程,例如 action创造者创造。我们如何对 RTK 创建的 Redux 进行单元测试createSlice?例如,由于动作创建器是自动创建的,测试它们是否有意义?一般来说,由于大部分 RTK 设置是自动的,我们需要测试什么?Redux Tool Kit 是否有任何工具可以使这更容易?(我没有看到)。

此外,我们还有 Redux Thunks,我们已经“手工”设置了它。我们看到了Redux 文档的建议,但是参考上述内容,我们是否应该以不同的方式处理此测试,因为我们使用 RTK 和createSlice?

最后,Redux 所依赖的 API 调用通过 Apollo Client 运行。我看到Apollo 关于如何使用 React 客户端测试 React 的建议。为了测试 Redux,我们是否应该使用类似https://www.npmjs.com/package/mock-apollo-client 的东西来模拟 Apollo Client ?

reactjs redux react-redux react-apollo redux-toolkit

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

跳过参数在来自@apollo/react-hooks 的 useQuery 钩子中被忽略

问题:

你好,所以我在我的 ReactJS 应用程序上使用 apollo-client 已经有一段时间了。我刚刚注意到,有时当我使用useQuery钩子时,执行完全忽略skip参数,并继续onCompleted(尽管没有任何数据)。有趣的是,它也没有向我的端点发出 API 请求。但是,如果我只是设置skip为 false,那么一切正常(如预期)。

此外,每次我使用useQuerywith时都不会发生这种情况skip,它似乎适用于某些而不是其他。

为什么 apollo 忽略skip参数并onCompleted立即使用空数据执行?有没有修复(除了useLazyQuery)?

代码示例:

const userQuery = useQuery(GET_USER, {
    variables: {
      value: userId,
    },
    skip: true,
    onCompleted: props => {
      console.log(`props => `, props)
      const {
        user: { type, role, firstName, lastName, permissions },
      } = props;

      setValue('firstName', firstName);
      setValue('lastName', lastName);
      setValue(
        'type',
        userTypes.find(({ value }) => value === type),
      );
      setValue( …
Run Code Online (Sandbox Code Playgroud)

apollo reactjs react-apollo apollo-client react-apollo-hooks

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

如何将 apollo 客户端 fetchMore updateQuery 转换为 apollo 缓存合并功能?

我正在学习 apollo 和 graphQL,并且有一个简单的应用程序,它显示一个数据列表,带有一个添加到数组的 fetchMore 函数。

我想删除 updateQuery,因为它已被弃用并使用新的字段策略合并功能。当前缓存设置和 updateQuery 如下所示:

const cache = new InMemoryCache({
  typePolicies: {
    client_client: {
      fields: {
        // add local only value to clients
        isEdited: {
          read(value = false) {
            // when writing the new value return new value or false as default
            return value;
          },
        }
      }
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
  const onFetchMore = () => {
    fetchMore({
      variables: {
        offset: page
      },
      updateQuery: (previousResult, { fetchMoreResult, queryVariables }) => {
        return {
          ...previousResult,
          client_client: [ …
Run Code Online (Sandbox Code Playgroud)

apollo graphql react-apollo apollo-client

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

打字稿中的 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
查看次数

在中继分页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
查看次数