Introduksjon til API-anrop med reaksjon og aksios

Denne opplæringen vil lære deg hvordan du bruker Axios for å hente data og deretter hvordan du kan manipulere den og til slutt vise den på siden din med filtreringsfunksjonalitet. Du lærer hvordan du bruker kartet, filtrerer og inkluderer metoder underveis. Dessuten skal du opprette en høyere rekkefølge komponent (HOC) for å håndtere lastingstilstanden til de hentede dataene fra API-endepunktet.

La oss starte med en ren React-app. Jeg antar at du bruker create reagere-app, og filnavnene vil være i samsvar med sine utganger.

Vi trenger bare å installere Axios-modulen for denne opplæringen.

Gå til prosjektkatalogen din via terminalvinduet og skriv inn npm installere aksios-save for å installere Axios for prosjektet lokalt.

Henting av dataene

Vi bruker API for tilfeldig brukergenerator for å hente tilfeldig brukerinformasjon til bruk i vår søknad.

La oss legge til Axios-modulen i vår søknad ved å importere den til vår App.js fil.

importere aksios fra 'axios'

Random User Generator API tilbyr en rekke alternativer for å lage ulike typer data. Du kan sjekke dokumentasjonen for mer informasjon, men for denne opplæringen vil vi holde det enkelt.

Vi ønsker å hente ti forskjellige brukere, og vi trenger bare navnet, etternavnet og en unik ID, som kreves for React når du lager lister over elementer. For å gjøre anropet litt mer spesifikt, la oss inkludere nasjonalitetsalternativet som et eksempel.

Nedenfor er API som vi skal ringe for.

Legg merke til at jeg ikke brukte id alternativet som tilbys i API-en på grunn av at det noen ganger kommer tilbake null for noen brukere. Så, for å sikre at det blir en unik verdi for hver bruker, inkluderte jeg registrert alternativet i APIen.

https://randomuser.me/api/?results=10&inc=name,registered&nat=fr

Du kan kopiere og lime det inn i nettleseren din, og du vil se de returnerte dataene i JSON-format.

Nå er det neste å lage en API-samtale gjennom Axios.

Først av alt, la oss lage en stat slik at vi kan lagre de hentede dataene.

Inne i vår app komponent, legg til en klassekonstruktør og deretter opprett tilstanden.

 constructor (rekvisitter) super (rekvisitter) this.state = users: [], store: []

Her ser du brukere og butikk stater. En vil bli brukt til filtreringsformål og vil ikke bli redigert, og den andre vil holde filterresultatene som vil bli vist i DOM.

Nå gå videre og opprett componentDidMount () livscykluskrok.

I denne livscykluskroken henter vi dataene, og deretter ved å bruke kart metode, vil vi lage nye mellomliggende data som vi vil bruke inne i setState metode.

Hvis du sjekker resultatet av API-anropet i nettleseren din, ser du at det er først og siste nøkkelverdier par inne i Navn objekt, men ikke nøkkelverdier for et fullt navn. Så vi vil kombinere først og siste for å lage et fullt navn inne i et nytt JavaScript-objekt. Legg merke til at JSON og JavaScript Object er forskjellige ting, selv om de i utgangspunktet fungerer på samme måte.

La oss flytte trinn for trinn.

Legg til følgende kode i din app komponent.

componentDidMount () axios.get ('https://randomuser.me/api/?results=10&inc=name,registered&nat=fr') .then (json => console.log (json))

Når du sjekker konsollen, vil du se en objektutgang. Hvis du åpner dette objektet, er det et annet objekt inni det som heter data, og inne data, er det en oppstilling som heter resultater.

La oss videre endre console.log (json).

componentDidMount () axios.get ('https://randomuser.me/api/?results=10&inc=name,registered&nat=fr') .then (json => console.log (json.data.results [0]. navn først)) 

Her nådde vi navnet på den første verdien i resultatlisten.

La oss nå bruke den innebygde kart Metode for JavaScript for å iterere gjennom hvert element inne i arrayet og opprette en ny rekke JavaScript-objekter med en ny struktur.

componentDidMount () axios.get ('https://randomuser.me/api/?results=10&inc=name,registered&nat=fr') .then (json => json.data.results.map (resultat => ( navn: '$ result.name.first $ result.name.last', id: result.registered)) .then (newData => console.log (newData))

Her kalte vi kart metode på json.data.results, som er en matrise, og deretter referert hvert element av arrayet som resultat (Legg merke til singular / flertallforskjellen). Deretter skapte vi et annet objekt ved å bruke nøkkelverdi-paret for hver gjenstand inne i arrayet Navn og id nøkkelverdier par.

På slutten brukte vi en annen deretter metode for å kunne se på våre nye data. Vi refererte det som NewData, og så loggte vi nettopp på konsollen for å se om alt gikk som planlagt.

Du bør se et nytt utvalg med objekter som har Navn og id parene.

Lagring av dataene

I stedet for å logge resultatet til konsollen, må vi lagre det. For å gjøre det, vil vi bruke setState.

componentDidMount () axios.get ('https://randomuser.me/api/?results=10&inc=name,registered&nat=fr') .then (json => json.data.results.map (resultat => ( navn: '$ result.name.first $ result.name.last', id: result.registered)) .then (newData => this.setState (users: newData, store: newData) ) .catch (error => alert (error))

Her satt vi i utgangspunktet begge deler brukere og butikk data med vår nye NewData matrise.

Vi trenger to variabler på grunn av det faktum at vi må lagre de opprinnelige dataene og aldri miste det. Ved å bruke informasjonen inne i butikk stat, vi kan filtrere dataene og fylle ut brukere stat og vis den på siden. Dette blir tydeligere når vi implementerer filtreringsfunksjonaliteten.

Sist men ikke minst, la vi til å fange å faktisk fange eventuelle feil under henting og vise feilen som en varselmelding.

Filtreringsfunksjonalitet

Ideen om filtrering er ganske enkel. Vi har vår butikk state, og det holder alltid de opprinnelige dataene uten å endre seg. Deretter ved å bruke filter Fungerer på denne tilstanden, får vi bare de matchende elementene og tilordner dem deretter til brukere stat.

this.state.store.filter (item => item.name.toLowerCase (). inkluderer (e.target.value.toLowerCase ()))

De filter Metode krever en funksjon som et argument, en funksjon som skal kjøres for hvert element i gruppen. Her refererer vi hvert element inne i arrayet som punkt. Så tar vi Navn nøkkel til hver punkt og konvertere den til små bokstaver for å gjøre vår filtreringsfunksjonalitet uforsiktig. 

Etter at vi har Navn nøkkel for punkt, vi sjekker om denne inkluderer søkestrengen vi skrev inn. inkluderer er en annen innebygd JavaScript-metode. Vi sender søkestrengen skrevet i inntastingsfeltet som et argument til inkluderer, og den returnerer om denne strengen er inkludert i variabelen den ble påkalt. Igjen konverterer vi inngangsstrengen til små bokstaver, slik at det ikke spiller noen rolle om du skriver inn store eller små bokstaver. 

Til slutt returnerer filtermetoden de matchende elementene. Så vi tar bare disse elementene og lagrer dem inni brukere staten gjennom setState.

Nedenfor finner du den endelige versjonen av funksjonen vi opprettet.

filternavn (e) this.setState (users: this.state.store.filter (item => item.name.toLowerCase (). inkluderer (e.target.value.toLowerCase ())))

Opprette komponentene

Selv om for dette lille eksempelet kunne vi sette alt inni app komponent, la oss dra nytte av React og lage noen små funksjonelle / statløse komponenter.

La oss legge til følgende struktur i gjengi metode av app komponent.

render () const users = this.state return ( 
NAVNELISTE
this.filterNames (e) />
);

For tiden vil vi bare fokusere på funksjonaliteten. Senere vil jeg gi CSS-filen jeg har opprettet.

Legg merke til at vi har searchFunc prop for Søkelinje komponent og brukernavn prop for Liste komponent.

Legg merke til at vi bruker brukere stat istedenfor butikk stat for å vise dataene fordi brukere tilstand er den som inneholder de filtrerte resultatene.

The SearchBar-komponenten

Denne komponenten er ganske enkel. Det tar bare filterNames Fungerer som en propp og kaller denne funksjonen når inngangsfeltet endres.

importere React fra 'react' const SearchBar = props => return ( 
) eksporter standard SearchBar

Listekomponenten

Denne vil bare liste navnene til brukerne.

Import React, Component fra "reagere" import LoadingHOC fra './LoadingHOC' import '... /styles/main.css' const List = (rekvisitter) => const brukernavn = rekvisitter returnere 
    brukernavn.map (bruker =>
  • User.name
  • )
) eksport standard LoadingHOC (Liste)

Her brukte vi igjen kart metode for å få hvert element i matrisen og opprette en 

  • element ut av det. Legg merke til at når du bruker kart For å lage en liste over elementer må du bruke en nøkkel for at React skal kunne følge med på hvert listeelement.

    Legg merke til at vi pakket inn Liste med en annen komponent som heter LoadingHOC før du eksporterer den. Slik fungerer Høyere-Bestandskomponenter (HOCs). 

    Det vi gjorde her er å sende vår komponent som et argument til en annen komponent før du eksporterer den. Så dette LoadingHOC komponenten vil være styrke vår komponent med nye funksjoner.

    The LoadingHOC Component

    Som jeg forklart kort før, tar en HOC en komponent som en inngang og eksporterer deretter en forbedret versjon av inngangskomponenten.

    Import React, Component fra 'React' import spinner fra '... /spinner.gif' const LoadingHOC = (WrappedState) => retur (klasse LoadingHOC utvider komponent render () return this.props.usernames.length == = 0 ?  :  ) eksport standard LoadingHOC 

    Inne i HOC kan vi få tilgang til rekvisitter av inngangskomponenten. Så vi bare sjekke om lengden på brukernavn prop er 0 eller ikke. Hvis det er 0, Dette betyr at dataene ennå ikke skal hentes fordi det er en tom rekkefølge som standard. Så vi viser bare en spinner GIF som vi importerte. Ellers viser vi bare inngangskomponenten selv.

    Det er importert for ikke å glemme å passere noen rekvisitter og angir tilbake til inngangskomponenten med en spredningsoperatør. Ellers vil komponenten bli fratatt dem.

    CSS-fil

    Nedenfor finner du CSS-filen som er spesifikk for dette eksemplet.

    kropp, html -webkit-font-utjevning: antialiased; margin: 0; polstring: 0; bakgrunnsfarge: # f1f1f1; font-familie: 'Raleway', sans-serif; -webkit-tekststørrelsesjustering: 100%;  kropp display: flex; begrunn-innhold: center; skriftstørrelse: 1rem / 16; margin-topp: 50px;  li, ul listestil: none; margin: 0; polstring: 0;  ul margin-top: 10px;  li font-size: 0.8rem; margin-bunn: 8px; tekst-align: center; farge: # 959595;  li: siste-of-type margin-bunn: 50px;  .Kort font-size: 1.5rem; font-weight: bold; display: flex; flex-retning: kolonne; justeringselementer: center; bredde: 200px; border-radius: 10px; bakgrunnsfarge: hvit; boks-skygge: 0 5px 3px 0 #ebebeb;  .header posisjon: relative; skriftstørrelse: 20px; margin: 12px 0; farge: # 575757;  .header :: etter innhold: "; posisjon: absolutt; venstre: -50%; bunn: -10px; bredde: 200%; høyde: 1px; bakgrunnsfarge: # f1f1f1; .searchBar text-align: senter: margin: 5px 0; grense: 1px solid # c4c4c4; høyde: 20px; farge: # 575757; border-radius: 3px; .searchBar: fokus outline-width: 0; .searchBar :: placeholder color: #dadada; .isLading margin: 30px 0; width: 150px; filter: opacity (0.3); 

    Konklusjon

    Gjennom denne opplæringen tok vi en rask titt på Random User Generator API som en kilde til tilfeldige data. Da hentet vi dataene fra et API-endepunkt og omstrukturerte resultatene i et nytt JavaScript-objekt med kart metode.

    Det neste var å lage en filtreringsfunksjon med filter og inkluderer metoder. Til slutt opprettet vi to forskjellige komponenter og forbedret en av dem med en høyere rekkefølge komponent (HOC) ved å innføre en lastindikator når dataene ikke er der ennå.

    I løpet av de siste par årene har React vokst i popularitet. Faktisk har vi en rekke elementer i Envato Market som er tilgjengelige for kjøp, gjennomgang, implementering og så videre. Hvis du leter etter flere ressurser rundt React, ikke nøl med å sjekke dem ut.