In deze zelfstudie leer je hoe je Axios gebruikt om gegevens op te halen en vervolgens hoe je deze kunt manipuleren en uiteindelijk op je pagina kunt weergeven met filterfunctionaliteit. Je zult leren hoe je de kaart kunt gebruiken, filteren en methodes kunt gebruiken. Bovendien gaat u een HOC (Higher-Order Component) maken om de laadstatus van de opgehaalde gegevens uit het API-eindpunt te verwerken.
Laten we beginnen met een schone React-app. Ik neem aan dat je het gebruikt create-reactie-app
, en de bestandsnamen zijn in overeenstemming met de uitvoer.
We hoeven alleen de Axios-module voor deze zelfstudie te installeren.
Ga via het terminalvenster naar uw projectdirectory en typ vervolgens in npm installeer axios -save
om Axios lokaal voor uw project te installeren.
We zullen de Random User Generator API gebruiken om willekeurige gebruikersinformatie op te halen voor gebruik in onze applicatie.
Laten we de Axios-module toevoegen aan onze applicatie door deze in ons te importeren App.js
het dossier.
importeer axios van 'axios'
De Random User Generator API biedt een heleboel opties voor het maken van verschillende soorten gegevens. U kunt de documentatie raadplegen voor meer informatie, maar voor deze zelfstudie houden we het eenvoudig.
We willen tien verschillende gebruikers ophalen en we hebben alleen de naam, achternaam en een unieke ID nodig, die vereist is voor React bij het maken van lijsten met elementen. Om de oproep een beetje specifieker te maken, laten we de optie nationaliteit opnemen als een voorbeeld.
Hieronder staat de API waarvoor we zullen bellen.
Merk op dat ik de ID kaart
optie geboden in de API vanwege het feit dat het soms terugkeert nul
voor sommige gebruikers. Dus, om er zeker van te zijn dat er een unieke waarde voor elke gebruiker zal zijn, heb ik de geregistreerd
optie in de API.
https://randomuser.me/api/?results=10&inc=name,registered&nat=fr
U kunt het kopiëren en in uw browser plakken en u zult de geretourneerde gegevens in JSON-indeling zien.
Het volgende is om een API-aanroep te doen via Axios.
Allereerst, laten we een staat maken zodat we de opgehaalde gegevens kunnen opslaan.
In onze App
component, voeg een klassenconstructor toe en maak vervolgens de status.
constructor (props) super (props) this.state = gebruikers: [], winkel: []
Hier zie je gebruikers
en op te slaan
staten. Eén daarvan wordt gebruikt voor filterdoeleinden en wordt niet bewerkt en de andere bevat de filterresultaten die in de DOM worden weergegeven.
Ga nu door en maak het componentDidMount ()
levenscyclus haak.
Binnen deze lifecycle-haak halen we de gegevens op en gebruiken we de kaart
methode, zullen we nieuwe tussentijdse gegevens maken die we zullen gebruiken binnen de setstate
methode.
Als u het resultaat van de API-aanroep in uw browser controleert, ziet u dat dat er is eerste en laatste sleutel-waarde paren binnen de naam object, maar geen sleutel / waarde-paar voor een volledige naam. Dus we zullen combineren eerste en laatste om een volledige naam in een nieuw JavaScript-object te maken. Merk op dat JSON en JavaScript Object verschillende dingen zijn, hoewel ze in principe op dezelfde manier werken.
Laten we stap voor stap gaan.
Voeg de volgende code toe aan uw App
bestanddeel.
componentDidMount () axios.get ('https://randomuser.me/api/?results=10&inc=name,registered&nat=fr') .then (json => console.log (json))
Wanneer u de console controleert, ziet u een objectuitvoer. Als u dit object opent, is er een ander object met de naam erin gegevens
, en binnen gegevens, is er een array met de naam uitslagen
.
Laten we verder veranderen 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]. naam eerst))
Hier bereikten we de naam van de eerste waarde binnen de resultatenreeks.
Laten we nu de ingebouwde gebruiken kaart
JavaScript-methode om elk element in de array te doorlopen en een nieuwe array JavaScript-objecten met een nieuwe structuur te maken.
componentDidMount () axios.get ('https://randomuser.me/api/?results=10&inc=name,registered&nat=fr') .then (json => json.data.results.map (result => ( name: '$ result.name.first $ result.name.last', id: result.registered))) .then (newData => console.log (newData))
Hier hebben we de kaart
methode op json.data.results
, die een array is en vervolgens elk element van de array doorverwijst als resultaat
(let op het enkelvoud / meervoudsverschil). Vervolgens hebben we met behulp van het sleutel / waarde-paar van elk object in de array een ander object gemaakt met naam en ID kaart sleutel-waarde paren.
Aan het eind gebruikten we een andere dan
methode om naar onze nieuwe gegevens te kunnen verwijzen. We noemden het als nieuwe data
, en toen hebben we net ingelogd op de console om te kijken of alles volgens plan verliep.
Je zou een nieuwe array met objecten moeten zien naam en ID kaart paren.
In plaats van het resultaat bij de console te registreren, moeten we het opslaan. Om dat te doen, zullen we gebruiken setstate
.
componentDidMount () axios.get ('https://randomuser.me/api/?results=10&inc=name,registered&nat=fr') .then (json => json.data.results.map (result => ( name: '$ result.name.first $ result.name.last', id: result.registered))) .then (newData => this.setState (users: newData, store: newData) ). catch (fout => waarschuwing (fout))
Hier hebben we in eerste instantie beide ingesteld gebruikers
en op te slaan
gegevens met onze nieuwe nieuwe data
rangschikking.
We hebben twee variabelen nodig vanwege het feit dat we de originele gegevens moeten opslaan en nooit mogen verliezen. Door de informatie binnen de op te slaan
Staat, we kunnen de gegevens filteren en vervolgens de gebruikers
staat en laat het zien op de pagina. Dit wordt duidelijker wanneer we de filterfunctionaliteit implementeren.
Last but not least, we hebben toegevoegd vangst
om eventuele fouten tijdens het ophalen te vangen en de fout weer te geven als een waarschuwingsbericht.
Het idee van filteren is vrij eenvoudig. We hebben onze op te slaan
staat en de originele gegevens worden altijd bewaard zonder te veranderen. Dan, door de filter
functie op deze staat, krijgen we alleen de overeenkomende elementen en dan toewijzen aan de gebruikers
staat.
this.state.store.filter (item => item.name.toLowerCase (). includes (e.target.value.toLowerCase ()))
De filter
methode vereist een functie als een argument, een functie die moet worden uitgevoerd voor elk element in de array. Hier verwijzen we elk element binnen de array naar item
. Dan nemen we de naam
sleutel van elk item
en converteer het naar kleine letters om ervoor te zorgen dat onze filterfunctionaliteit niet gevoelig is.
Nadat we de naam
sleutel voor de item
, we controleren of deze deze is omvat de zoekreeks die we hebben ingetypt. omvat
is een andere ingebouwde JavaScript-methode. We geven de zoekreeks die in het invoerveld is ingevoerd als argument door aan omvat
, en het retourneert als deze tekenreeks is opgenomen in de variabele waarop deze is aangeroepen. Nogmaals, we converteren de invoerreeks naar kleine letters, zodat het niet uitmaakt of u de hoofdletters of kleine letters invoert.
Uiteindelijk retourneert de filtermethode de overeenkomende elementen. Dus nemen we eenvoudig deze elementen en slaan ze op in de gebruikers
doorgeven setstate
.
Hieronder vindt u de definitieve versie van de functie die we hebben gemaakt.
filterNames (e) this.setState (users: this.state.store.filter (item => item.name.toLowerCase (). includes (e.target.value.toLowerCase ())))
Hoewel we voor dit kleine voorbeeld alles in de App
component, laten we profiteren van React en een paar kleine functionele / staatloze componenten maken.
Laten we de volgende structuur toevoegen aan de geven
methode van de App
bestanddeel.
render () const users = this.state return ();NAMENLIJSTthis.filterNames (e) />
Voorlopig zullen we ons alleen concentreren op de functionaliteit. Later zal ik het CSS-bestand dat ik heb gemaakt verstrekken.
Merk op dat we de hebben searchFunc
prop voor de Zoekbalk
component en de gebruikersnamen
prop voor de Lijst
bestanddeel.
Merk op dat we de gebruikers
staat in plaats van de op te slaan
Geef aan dat de gegevens moeten worden weergegeven, omdat de gebruikers
staat is degene die de gefilterde resultaten bevat.
Dit onderdeel is vrij eenvoudig. Het kost alleen de filterNames
fungeren als een prop en roept deze functie op wanneer het invoerveld verandert.
import Reageren vanaf 'react' const SearchBar = props => retourneren () standaardzoekBar exporteren
Deze zal eenvoudig de namen van de gebruikers vermelden.
import Reageren, Component van 'reageren' importeren LoadingHOC van './LoadingHOC' importeren '... /styles/main.css' const Lijst = (rekwisieten) => const gebruikersnamen = rekwisieten terugkeren (
Hier hebben we opnieuw het kaart
methode om elk item in de array te krijgen en een te maken item eruit. Merk op dat wanneer u gebruikt
kaart
om een lijst met items te maken, moet u een sleutel
zodat React elk lijstitem bijhoudt.
Merk op dat we ingepakt zijn Lijst
met een ander genoemd component LoadingHOC
voordat u het exporteert. Dit is hoe Heap-componenten (HOC's) werken.
Wat we hier hebben gedaan, is ons onderdeel doorgeven als argument aan een ander onderdeel voordat het wordt geëxporteerd. Dus dit LoadingHOC
component zal zijn het verbeteren onze component met nieuwe functies.
Zoals ik eerder kort heb uitgelegd, neemt een HOC een component als invoer en exporteert vervolgens een verbeterde versie van de invoercomponent.
import Reageren, Component uit 'react' import spinner uit '... /spinner.gif' const LoadingHOC = (WrappedState) => return (klasse LoadingHOC breidt component render () uit return this.props.usernames.length == = 0 ? :) exporteer standaard LoadingHOC
Binnen de HOC hebben we rechtstreeks toegang tot de rekwisieten van de invoercomponent. Dus we controleren alleen of de lengte van de gebruikersnamen
prop is 0 of niet. Als het is 0, dit betekent dat de gegevens nog moeten worden opgehaald omdat het standaard een lege array is. We laten dus alleen een GIF-spinner zien die we hebben geïmporteerd. Anders tonen we alleen de invoercomponent zelf.
Het wordt geïmporteerd om niet te vergeten eventuele rekwisieten door te geven en gaat terug naar de invoercomponent met een spread-operator. Anders zou uw component hiervan worden beroofd.
Hieronder vindt u het CSS-bestand dat specifiek is voor dit voorbeeld.
body, html -webkit-font-smoothing: antialiased; marge: 0; opvulling: 0; achtergrondkleur: # f1f1f1; font-family: 'Raleway', sans-serif; -webkit-tekst-formaat-aanpassen: 100%; body display: flex; justify-content: center; lettergrootte: 1rem / 16; margin-top: 50px; li, ul lijststijl: geen; marge: 0; opvulling: 0; ul margin-top: 10px; li font-size: 0.8rem; margin-bottom: 8px; text-align: center; kleur: # 959595; li: last-of-type margin-bottom: 50px; .Card font-size: 1.5rem; lettertype: vet; weergave: flex; flex-richting: kolom; align-items: center; breedte: 200 px; grensradius: 10px; achtergrondkleur: wit; box-shadow: 0 5px 3px 0 #ebebeb; .header positie: relatief; lettertypegrootte: 20px; marge: 12px 0; kleur: # 575757; .header :: after content: "; position: absolute; left: -50%; bottom: -10px; width: 200%; height: 1px; background-color: # f1f1f1; .searchBar text-align: midden; marge: 5px 0; rand: 1px vast # c4c4c4; hoogte: 20px; kleur: # 575757; randradius: 3px; .searchBar: focus outline-width: 0; .searchBar :: placeholder color: #dadada; .isLoading margin: 30px 0; width: 150px; filter: opacity (0.3);
In deze zelfstudie hebben we de Random User Generator API snel bekeken als een bron van willekeurige gegevens. Vervolgens haalden we de gegevens op van een API-eindpunt en herstructureerden de resultaten in een nieuw JavaScript-object met de kaart
methode.
Het volgende was om een filterfunctie te maken met de filter
en omvat
methoden. Ten slotte hebben we twee verschillende componenten gemaakt en één daarvan uitgebreid met een HOC (Higher-Order Component) door een laadindicator te introduceren als de gegevens er nog niet zijn.
In de afgelopen paar jaar is React in populariteit gegroeid. In feite hebben we een aantal items in Envato Market die beschikbaar zijn voor aankoop, beoordeling, implementatie enzovoort. Als u op zoek bent naar extra bronnen rond React, aarzel dan niet om ze te bekijken.