Introductie van Apollo Client met React voor GraphQL

GraphQL is recent populair geworden en zal waarschijnlijk de Rest API vervangen. In deze tutorial gebruiken we Apollo Client om te communiceren met de GraphQL API van GitHub. We zullen Apollo Client integreren met ReactJS, maar u kunt het ook gebruiken met verschillende andere clientplatforms.

Deze tutorial behandelt niet hoe een React-project moet worden gestart, maar u kunt gebruiken create-reactie-app starten.

Zodra we de react-app klaar hebben om te starten, moeten we de vereiste modules installeren.

Modules installeren

De volgende regel installeert alle vereiste modules.

npm install apollo-client-preset react-apollo graphql-tag graphql --save

Nu kunnen we onze component voorzien van een klant.

Een klant aan een component leveren

U kunt een client overal in uw componentcomponenthiërarchie opgeven. Het is echter altijd een goede gewoonte om de component, die uw hele applicatie verpakt, aan de klant te leveren.

import Reageren van 'reageren'; import ReactDOM van 'react-dom'; importeer de app van './App'; importeer ApolloProvider van 'react-apollo'; importeer ApolloClient van 'apollo-client'; importeer HttpLink van 'apollo-link-http'; import InMemoryCache van 'apollo-cache-inmemory'; const token = "YOUR_TOKEN"; const httpLink = uri: 'https://api.github.com/graphql', headers: authorization: 'Bearer $ token'; const client = nieuwe ApolloClient (link: new HttpLink (httpLink), cache: new InMemoryCache ()); ReactDOM.render (, document.getElementById ( 'root')); 

Hierboven zie je dat we de uri voor GitHub en heeft ook een specifiek token gebruikt headers. Je zou je eigen token moeten gebruiken die gegenereerd is met GitHub. Dus vergeet niet om het te vervangen YOUR_TOKEN.

Voor dit voorbeeld hebben we de API-token aan de clientzijde gedefinieerd. U mag uw API-token echter niet publiekelijk bekendmaken. Het is dus altijd goed om het op de server geabstraheerd van de client te houden.

Merk op dat we de hebben ingepakt  component met ApolloProvider en gebruikte de cliënt variabele die we hebben gemaakt voor de cliënt stutten.

GraphiQL-toepassing

Voordat ik met de vragen aan de slag ga, wil ik erop wijzen dat er een handige tool, GraphiQL, is voor het testen van je GraphQL-query's. Voordat u doorgaat, controleert u of u het hebt gedownload. 

Zodra u GraphiQL opent, moet u de GraphQL-eindpunt en HTTP-headers.

GraphQL-eindpunt: https://api.github.com/graphql

Headernaam: machtiging

Header Value: Drager YOUR_TOKEN

Natuurlijk moet je het vervangen YOUR_TOKEN met je eigen token. Vergeet niet om de Toonder voor je token bij het definiëren van de Header Value.

Als u geen applicatie wilt downloaden, kunt u ook de online GraphQL API Explorer voor GitHub gebruiken.

GraphQL-query's

In tegenstelling tot een REST-API met verschillende eindpunten, heeft de GraphQL-API maar één eindpunt en u haalt alleen datgene op dat is gedefinieerd door uw query.

De documentatie van GitHub's GraphQL API geeft je meer inzicht.

Het beste deel van de GraphiQL-toepassing is dat deze u toegang geeft tot documentatie voor vragen binnen de toepassing. U kunt de zijbalk aan de rechterkant met de naam zien Docs.

Laten we beginnen met de eenvoudigste zoekopdracht:

query viewer login

Deze query retourneert de aanmeldingsgegevens van de viewer. In dit geval bent u de kijker omdat u uw eigen API-token heeft gebruikt.

In deze zelfstudie zal ik geen gedetailleerde informatie over vragen geven. U kunt altijd de documentatie raadplegen en vragen over GraphQL-tools uitproberen om te zien of u de juiste gegevens krijgt.

Laten we de volgende vraag gebruiken voor de rest van de zelfstudie.

query ($ name: String!) search (query: $ name, last: 10, type: REPOSITORY) edges node ... on Repository id name description url

Deze query zoekt naar de laatste 10 opslagplaatsen die overeenkomen met de specifieke invoerreeks, die we in onze toepassing zullen definiëren.

Het geeft het ID kaartnaamOmschrijving, en url voor elk resultaat.

De GraphQL-query gebruiken in een reactiecomponent

We moeten de twee onderstaande modules importeren in onze React-component om de query binnen de component te kunnen definiëren en de resultaten vervolgens door te geven aan de component als rekwisieten.

importeer gql van 'graphql-tag'; importeer graphql van 'react-apollo';

Hier hebben we onze query toegewezen aan een constante variabele, maar we hebben de parameter niet gedefinieerd naam parameter.

const repoQuery = gql 'query ($ name: String!) search (query: $ name, last: 10, type: REPOSITORY) edges node ... on Repository id name description url'

Nu pakken we onze component in met de graphql HOC (hogere-ordecomponent) om de queryparameters te definiëren, de query uit te voeren en vervolgens het resultaat als rekwisieten door te geven aan onze component.

const AppWithData = graphql (repoQuery, options: variables: name: "tuts") (App)

Hieronder is de definitieve versie van onze component.

import Reageren, Component uit 'reageren'; importeer gql van 'graphql-tag'; importeer graphql van 'react-apollo'; class-app breidt component render () terug ( 
); const repoQuery = gql 'query ($ name: String!) search (query: $ name, last: 10, type: REPOSITORY) edges node ... on Repository id name description url' const AppWithData = graphql (repoQuery, options: variables: name: "tuts") (App) export standaard AppWithData;

Merk op dat we de feitelijke niet exporteren App component maar de ingepakte component, dat is AppWithData.

Controleer de gegevens in de console

Laten we doorgaan en toevoegen Console.log (this.props) naar de rendermethode van uw component.

class-app breidt component render () console.log (this.props) return ( 
);

Wanneer u de console van uw browser controleert, ziet u dat er twee objectlogboeken zijn.

Binnen elk object ziet u de gegevens eigendom. Dit wordt aan ons onderdeel geleverd via de graphql HOC.

Merk op dat het eerste logboek het laden: waar eigendom binnen gegevens, en het tweede logboek heeft laden: false en een nieuw genoemd object zoeken, dat is precies de data die we wilden hebben.

Geef de gegevens weer

Laten we wat JSX schrijven om de opgehaalde gegevens weer te geven.

Sinds de zoeken object is er initieel niet, we kunnen het niet direct proberen te renderen. Daarom moeten we eerst controleren of we de gegevens hebben opgehaald en de zoeken object is klaar voor gebruik.

Om dat te doen, zullen we gewoon de bezig met laden informatie verstrekt binnen de gegevens eigendom.

Als bezig met laden is waar dan geven we gewoon de Bezig met laden tekst, anders de gegevens zelf.

class-app breidt component render () terug ( 
this.props.data.loading === waar? "Bezig met laden": this.props.data.search.edges.map (data =>
  • Data.node.name
  • Data.node.description
)
);

Ik gebruikte de ?: ternaire operator voor standaard inline conditionele expressies. Als bezig met laden is waar we tonen Bezig met laden,en als het vals is, gebruiken we de kaartfunctie om onze gegevensmatrix te doorlopen om de informatie binnen de 

    en 
  • elementen.

    Dit is slechts een eenvoudig voorbeeld. U kunt een normale if-else-instructie gebruiken en verschillende resultaten retourneren voor uw weergavenmethode.

    Je kunt de Apollo-Client-with-React-repository bekijken, deze op je computer klonen en rondkijken.

    Postscriptum Vergeet niet om de blijk variabele met uw eigen API-token voor GitHub.

    Conclusie

    We hebben besproken hoe u aan de slag kunt met Apollo Client for React. We hebben de vereiste modules geïnstalleerd, de client ingesteld en vervolgens geleverd aan onze component bovenaan de componenthiërarchie. We hebben geleerd om GraphQL-query's snel te testen voordat ze in onze daadwerkelijke toepassing worden geïmplementeerd. Ten slotte hebben we de query geïntegreerd in een component React en de opgehaalde gegevens weergegeven.