美文网首页
apollo-graphql在react里面的使用

apollo-graphql在react里面的使用

作者: QLing09 | 来源:发表于2020-07-10 11:23 被阅读0次

apollo能做到什么

使用

引入

import React from 'react'
import ReactDOM from 'react-dom'
import './index.css'
import App from './App'
import { store, persistor } from './app/store'
import { Provider } from 'react-redux'
import { HelmetProvider } from 'react-helmet-async'
import * as serviceWorker from './serviceWorker'
import './i18n'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { ApolloClient  } from 'apollo-client'
import { ApolloLink } from 'apollo-link'
import { createHttpLink } from 'apollo-link-http'
import { onError } from 'apollo-link-error'
import { ApolloProvider } from 'react-apollo'
import { PersistGate } from 'redux-persist/integration/react'
import { Error_MESSAGE } from './app/_types/_globalTypes'
import { ToastContainer, toast } from 'react-toastify'
import 'react-toastify/dist/ReactToastify.css'


const uri = process.env.REACT_APP_API_BASE_URL
const client = new ApolloClient({
    link: ApolloLink.from([
        // error log middleware
        onError(({ graphQLErrors, networkError = {} as any }) => {
            if (graphQLErrors)
                graphQLErrors.map(({ message }: Error_MESSAGE) => toast(message))
            if (networkError) {
        const href = window.location.href
        if (networkError.statusCode === 401 && !href.includes('/login')) {
          window.location.href = '/login'
        }
        const text = networkError?.bodyText ?? ''
        if (text) {
          toast.error(networkError?.bodyText??'')
        }
      }
        }),
        createHttpLink({
            uri,
            credentials: 'include',
        }),
    ]),
    cache: new InMemoryCache(),
});

ReactDOM.render(
  <React.StrictMode>
    <ApolloProvider client={client}>
      <Provider store={store}>
        <PersistGate loading={null} persistor={persistor}>
          <HelmetProvider>
            <App/>
            <ToastContainer />
          </HelmetProvider>
        </PersistGate>
      </Provider>
    </ApolloProvider>
  </React.StrictMode>,

  document.getElementById('root')
)

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister()

ajax 交互

export const GET_LOGIN = gql`
  query Login( $password: String, $account: String ) {
    login(password: $password, account: $account) {
      account
      avatarUrl
      nickname
      updateTime
    }
  }
`
// typescript 需要定义返回内容字段类型
export interface LOGIN_MANAGER {
  /**
   * 账号
   */
  account: string | null;

  /**
   * 用户头像
   */
  avatarUrl: string | null;

  /**
   * id
   */
  id: string | null;

  /**
   * 昵称
   */
  nickname: string | null;

  /**
   * 更新时间
   */
  updateTime: number | null;
}

页面使用

import { useLazyQuery } from '@apollo/react-hooks'
import { LOGIN_DATA, GET_LOGIN } from './gqls'
……
const [getLogin, { loading: loginLoading, data: loginInfo }] = useLazyQuery(GET_LOGIN)

// 提交事件出发
const submitLogin = () => {
    // 验证
    if (!validateFormSync(formData)) return false
    getLogin({
      variables: formData
    })
  }

apollo-link-state

可以使用apollo-link-state 存储数据

With apollo-link-state, you no longer have to maintain a second store for local state. You can instead use the Apollo Client cache as your single source of truth that holds all of your local data alongside your remote data. To access or update your local state, you use GraphQL queries and mutations just like you would for data from a server.

apollo-link-state 使用

import { withClientState } from 'apollo-link-state';

// This is the same cache you pass into new ApolloClient
const cache = new InMemoryCache(...);

const stateLink = withClientState({
  cache,
  resolvers: {
    Mutation: {
      updateNetworkStatus: (_, { isConnected }, { cache }) => {
        const data = {
          networkStatus: {
            __typename: 'NetworkStatus',
            isConnected
          },
        };
        cache.writeData({ data });
        return null;
      },
    },
  }
});

demo参考

demo

相关文章

网友评论

      本文标题:apollo-graphql在react里面的使用

      本文链接:https://www.haomeiwen.com/subject/umwqcktx.html