使用 Redux Thunk 和 Apollo Graphql 做出反应 - 如何访问 client.query?

Posted

技术标签:

【中文标题】使用 Redux Thunk 和 Apollo Graphql 做出反应 - 如何访问 client.query?【英文标题】:React With Redux Thunk and Apollo Graphql - How to access client.query? 【发布时间】:2020-01-21 15:48:12 【问题描述】:

这是我的 app.js

import React from 'react'
import  Provider  from 'react-redux'
import  View  from 'react-native'
import  createStore, applyMiddleware  from 'redux'
import ReduxThunk from 'redux-thunk'
import Reducers from './redux'
import Routes from './config/routes'
import  ApolloClient, HttpLink, InMemoryCache  from 'apollo-boost'
import  ApolloProvider  from 'react-apollo'

const cache = new InMemoryCache();
const client = new ApolloClient(
cache,
link: new HttpLink(
    uri: '...',
),
)

class App extends React.Component 
  constructor(props) 
    super(props)
    this.state = 
        initialized: true
    

render() 
    return (
        <View style= flex: 1 >
            <ApolloProvider client=client>
                <Provider store=store>
                    <Routes />
                </Provider>
            </ApolloProvider>
        </View>
    )


const store = createStore(Reducers, , applyMiddleware(ReduxThunk))
export default App

好的,到目前为止...基本。

这将渲染我的路由的初始文件:welcome.js

import React from 'react'
import ... from 'react-native'
import  Actions  from 'react-native-router-flux'
import style from './style'
import  connect  from "react-redux"
import gql from 'graphql-tag'

class Welcome extends React.Component 
    constructor(props) 

       const LOGIN_MUTATION = gql`
         mutation 
          login(
           email:"test@test.com"
           password:"1234"
      ) token
     
    `
// Bellow will not work..I've no idea how to call the client that
// I set at <ApolloProvider client=client>
client
   .mutate(
    mutation: LOGIN_MUTATION
)
.then(res => console.log(res))
.catch(err => console.log(err))
    

const mapStateToProps = state => (



)

export default connect(mapStateToProps,


)(Welcome)

所以,客户端是在我的 app.js 上定义的,它应用了提供者并注入了路由。 我想知道如何能够将 app,js 中定义的客户端执行到welcome.js中

【问题讨论】:

【参考方案1】:

您可以在组件中使用ApolloConsumer 来访问客户端:

要直接访问客户端,请创建一个 ApolloConsumer 组件并提供一个 render prop 函数作为其子组件。 render prop 函数将使用您的 ApolloClient 实例作为其唯一参数调用。

例如

import React from 'react';
import  ApolloConsumer  from "react-apollo";

const WithApolloClient = () => (
  <ApolloConsumer>
    client => "We have access to the client!" /* do stuff here */
  </ApolloConsumer>
);

【讨论】:

【参考方案2】:

强烈建议您切换到新的 React Hooks 版本,使用它们,您只需编写 const client = useApolloClient() 即可访问您的客户端实例:

import  useApolloClient  from '@apollo/react-hooks';

const Welcome = () => 
  const client = useApolloClient();

  return <h1>Welcome</h1>;

关于ApolloProvider,它的配置方式与您所做的相同,只是您也可以直接从钩子包中导入它,即import ApolloProvider from '@apollo/react-hooks——因此您可以删除react-apollo

在此处查看有关钩子的更多详细信息:https://www.apollographql.com/docs/react/hooks-migration/。

但如果你真的想继续使用类组件,你可以这样做:

import  getApolloContext  from 'react-apollo';

class Welcome extends React.Component 
  ...


Welcome.contextType = getApolloContext();

然后你就可以在你的类中使用this.context.client 访问客户端了:

class Welcome extends React.Component 
  render() 
    console.log('client', this.context.client);

    return ...;
  


Welcome.contextType = getApolloContext();

【讨论】:

事实上,欢迎任何好的建议,埃德蒙多!谢谢 !我会尽快测试它 所以,如果您想使用钩子编辑解决方案的答案...请随意 刚刚添加了一个使用钩子的示例。

以上是关于使用 Redux Thunk 和 Apollo Graphql 做出反应 - 如何访问 client.query?的主要内容,如果未能解决你的问题,请参考以下文章

将 redux 客户端从 REST 转换为 GraphQL Apollo?

Redux Thunk 返回调度不起作用

在 redux-thunk 中循环 api 调用(React redux 应用程序)

如何使用 redux-thunk `bindActionCreators`

如何使用 redux-thunk 和 TypeScript 调度 ThunkAction

如何使用“redux-thunk”调用 ajax?