query { allUsers { id name } }
query { allPosts(orderBy: updatedAt_DESC, first: 7){ id title user { id name } } }
npm install apollo-boost react-apollo graphql-tag graphql --save npm install react-router-dom --save
import React from 'react'; import { Route, Switch, BrowserRouter } from 'react-router-dom'; import { ApolloProvider } from 'react-apollo'; import ApolloClient from 'apollo-boost'; import Layout from './Layout'; import AllUsers from './AllUsers'; import TopPosts from './TopPosts'; import NewPost from './NewPost'; const client = new ApolloClient({ uri: 'https://api.graph.cool/simple/v1/ciyz901en4j590185wkmexyex', }); const App = () => ( <ApolloProvider client={client}> <BrowserRouter> <Layout> <Switch> <Route exact path='/' component={ AllUsers } /> <Route exact path='/posts' component={ TopPosts } /> <Route exact path='/user/:userId' component={ NewPost } /> </Switch> </Layout> </BrowserRouter> </ApolloProvider> ); export default App;
import React from 'react'; import { Link } from 'react-router-dom' import { Query } from "react-apollo"; import gql from "graphql-tag"; import TopPosts from './TopPosts'; const AllUsers = () => ( <Query query={gql` query { allUsers { id name } } `} > {({ loading, error, data }) => { for (let key in arguments[0]) console.log(key, arguments[0][key]); console.log('data', data) if (loading) return <p>Loading...</p>; if (error) return <p>Error :(</p>; return ( <ul key='allUsers'> {data.allUsers.map(({ id, name }) => ( <li key={id}><Link to={`/user/${id}`}>{name ? name : 'incognoito'}</Link></li> ))} </ul> ); }} </Query> ); export default AllUsers
import React from 'react'; import { Link } from 'react-router-dom' import { Mutation } from 'react-apollo'; import gql from 'graphql-tag'; const NewPost = (props) => ( <Mutation mutation={gql` mutation createPost($text: String!, $title: String!, $userId: ID!){ createPost(text: $text, title: $title, userId: $userId) { id } } `} > {(createPost, { loading, error, data }) => { if (loading) return <p>Loading...</p>; if (error) return <p>Error :(</p>; let userId, title, text return ( <form onSubmit={e => { e.preventDefault(); createPost({ variables: { userId: userId.value , title: title.value , text: text.value , }}); }}> <input type='hidden' value={ props.match.params.userId } ref={ node => userId = node } /> <input type='text' ref={ node => title = node } /> <textarea ref={ node => text = node } /> <button type='submit' /> </form> ); }} </Mutation> ); export default NewPost;
import React from 'react'; import { Link } from 'react-router-dom' import { Query } from 'react-apollo'; import gql from 'graphql-tag'; const Post = (props) => ( <Query query={gql` query { Post(id: "${props.match.params.postId}") { id title text } } `} fetchPolicy='network-only' > {({ loading, error, data }) => { if (loading) return <p>Loading...</p>; if (error) return <p>Error :(</p>; return ( <ul key='topPosts'> <li>{data.Post.id}</li> <li>{data.Post.title}</li> <li>{data.Post.text}</li> </ul> ); }} </Query> ); export default Post;
Source: https://habr.com/ru/post/358292/
All Articles