Используя apollo и реагировать, я хочу обновить свое локальное состояние apollo на основе результата (удаленного) запроса apollo.
Запрос имеет тип [String!]!
, мое локальное состояние содержит {name}типа String
.Я хочу присвоить локальное {имя} первому элементу, возвращенному запросом.
const App = compose(
graphql(gql`{ name @client }`, { name: 'localData' }),
graphql(gql`{ currencies { name } }`)
)(({ localData }) => <h1>{ localData.name }</h1>)
Я не хочу использовать componentWillReceiveProps
(мутирует там локальное состояние, как только опоры приходят изудаленный запрос), так как это плохая практика.
Мне нужно использовать локальное состояние apollo, а не только состояние компонента, так как это значение будет использоваться другими компонентами.
Iпопытался использовать props
конфиг graphql
hoc, но он чувствует себя так же плохо, как componentWillReceiveProps, и привести к бесконечному циклу.
Есть идеи?
Соответствующие версии:
"apollo-boost": "^0.1.19",
"apollo-link-state": "^0.4.2",
"react-apollo": "^2.2.4",
Код
import React from 'react'
import ReactDOM from 'react-dom'
import ApolloClient from 'apollo-boost'
import gql from 'graphql-tag'
import { InMemoryCache } from 'apollo-cache-inmemory'
import { ApolloProvider, graphql, compose } from 'react-apollo'
import { ApolloLink } from 'apollo-link'
import { withClientState } from 'apollo-link-state'
import { HttpLink } from 'apollo-link-http'
const resolvers = {
Mutation: {
updateName: (ops, { name }, { cache }) => cache.writeData({ data: { name } })
}
}
const typedefs = gql`
type Query {
name: String
}
type Mutation {
updateName(name: String): String
}
`
const defaults = { name: 'defaultName' }
const cache = new InMemoryCache()
const stateLink = withClientState({
cache,
defaults,
resolvers
});
const apolloClient = new ApolloClient({
uri: '/store/api/graphql',
link: ApolloLink.from([stateLink, new HttpLink()]),
cache,
clientState: {
defaults,
resolvers,
typedefs
}
})
const App = compose(
graphql(gql`{ name @client }`, { name: 'localData' }),
graphql(gql`{ currencies { name id } }`)
)(({ localData }) => <h1>{ localData.name }</h1>)
ReactDOM.render(
<ApolloProvider client={ apolloClient }>
<App />
</ApolloProvider>,
document.getElementById('app')
)