Skip to content

Archives

  • 2022 január
  • 2021 december
  • 2021 november
  • 2021 október
  • 2021 szeptember

Categories

  • Nincs kategória
Trend RepositoryArticles and guides
Articles

React Native Tutorial – Az első iOS alkalmazásod építése JavaScript segítségével (1. rész)

On november 24, 2021 by admin
  • A szerzőről
  • További olvasnivalók a SmashingMag-on:
  • Mit fogunk építeni
  • Takeaways
  • Egy üres React Native projekt beállítása
  • Háttérképadatok lekérése az API-ból
  • Switching To ES2015 Class Syntax
  • Betöltőképernyő hozzáadása
  • Szűrés és véletlenszerű háttérképek kiválasztása
  • A Swiper komponens hozzáadása
  • A React Native bemutató összefoglalása

A szerzőről

Nash Vail szenvedélye a felhasználói felületek tervezése. Jelenleg informatika szakos hallgató, és aktívan keresi a gyakornoki lehetőségeket. …További információNash↬

  • 22 perc olvasás
  • Mobil,JavaScript,Alkalmazások,iOS,React,Swift
  • Off-line olvasásra mentve
  • Megosztás Twitteren, LinkedIn
Ezek a keretrendszerek és az egész ötlet, hogy JavaScript segítségével mobil alkalmazásokat építsünk, sosem vonzott azonban. Mindig azt gondoltam, miért nem tanulom meg a Swiftet/Objective-C-t vagy a Javát, és építek igazi alkalmazásokat? Ez határozottan jelentős mennyiségű tanulást igényel, de nem ez az, amit mi fejlesztők csinálunk, és amiben jónak kell lennünk? Gyorsan megtanulni új nyelveket és keretrendszereket? Akkor mi értelme van? Számomra az előnyök sosem ellensúlyozták a kételyeket.

A mobilalkalmazások JavaScript segítségével történő építésének ötlete nem új. Láttunk már olyan keretrendszereket, mint az Ionic és a PhoneGap, amelyek felvállalták a kihívást, és bizonyos mértékig sikerült is elég nagy fejlesztői és közösségi támogatást szerezniük. A bemutató 2. részéhez.

Ezek a keretrendszerek és az egész ötlet, hogy mobilalkalmazásokat építsünk JavaScript segítségével, azonban soha nem vonzott engem. Mindig azt gondoltam, miért nem tanulom meg a Swift/Objective-C-t vagy a Javát, és építek igazi alkalmazásokat? Ez mindenképpen jelentős mennyiségű tanulást igényel, de nem ez az, amit mi fejlesztők csinálunk, és amiben jónak kell lennünk? Gyorsan megtanulni új nyelveket és keretrendszereket? Akkor mi értelme van? Számomra az előnyök sosem ellensúlyozták a kételyeket.

Míg el nem olvastam ezt a cikket a Chalk + Chisel-en, különösen a következő sort:

Pár hónappal később már elég magabiztos vagyok ahhoz, hogy azt mondjam, talán soha többé nem írok iOS alkalmazást Objective-C-ben vagy Swiftben.

Mi? Te most… komolyan beszélsz?

További olvasnivalók a SmashingMag-on:

  • Miért érdemes megfontolni a React Native-ot a mobilalkalmazásodhoz
  • Server-Side Rendering With React, Node And Express
  • How To Scale React Applications
  • Internationalizing React Apps

Egy ilyen merész állítást olvasva rávettem magam, hogy adjak egy esélyt a React Native-nak. Miért is ne? Már használtam a Reactot és imádtam. A React Native annyira hasonlít a Reactra (duh!), hogy ha már React fejlesztő vagy, akkor is otthonosan fogod érezni magad. Még ha nem is vagy az, a React szerencsére nagyon könnyen elsajátítható.

Mit fogunk építeni

Soha nem volt szerencsém megtalálni a tökéletes háttérképes alkalmazást az iPhone-omra az App store-ban. Az asztali számítógépen az Unsplash az egyablakos bolt az összes háttérképes igényemhez. A telefonon: Beállítások → Háttérkép 🙁

Szóval, ellentétben néhány más oktatóprogrammal, ahol számlálókat építesz és alig használod őket, ebben az oktatóprogramban együtt építünk magunknak egy olyan alkalmazást, amely véletlenszerű lenyűgöző háttérképeket húz az Unsplash-ről, esztétikusan megjeleníti őket, és lehetővé teszi, hogy az általad választott háttérképeket a Camera Rollba mentsd. Higgye el, én már azon kaptam magam, hogy többet használom ezt az alkalmazást, mint azt eredetileg gondoltam. Még ha ennek a bemutatónak a végére a React Native nem is nyűgöz le, akkor is egy igazán klassz háttérképes alkalmazással fogsz végezni. Hát nem nagyszerű?

Mielőtt elkezdenénk, íme néhány dolog, amit ismerned kell:

  1. JavaScript
  2. Néhány ES2015 funkció, nevezetesen az osztályok, a nyílfüggvények, a strukturálás és a sablonsztringek
  3. Mac OS X Terminal
  4. CSS (igen!)
  5. React (opcionális)

Még egy dolog. Ahogy a cím is egyértelműen jelzi, ebben a tutorialban egy iOS alkalmazást fogunk építeni. Ami megköveteli, igen, még a React Native-nal is, hogy Mac-et használj. A React Native-tal biztosan lehet Android alkalmazásokat építeni Windowson és Linuxon, de iOS-eseket nem. Ezért innentől kezdve ez a bemutató feltételezi, hogy Mac OS X-et futtatsz.

Takeaways

A bemutató végére eléggé meg fogod ismerni a React Native-ot ahhoz, hogy azonnal elkezdhess saját alkalmazásokat írni. Áttekintjük egy projekt beállítását az Xcode-ban, a harmadik féltől származó modulok és komponensek telepítését, a könyvtárak összekapcsolását, a flexbox-szal való stilizálást, egy egyéni gesztushallgató létrehozását és még sok más dolgot.

Ha még nem használtál Reactot korábban, ez a bemutató szintén megismertet téged a Reacttal. A React az új, forró JS könyvtár, amelyben rengeteg lehetőség rejlik, és nem látom, hogy a közeljövőben bárhová is elmenne.

Ezt a bemutatót két részre osztottuk a könnyebbség kedvéért. Mindkét rész öt szakaszból áll. Minden szakaszban elérünk egy célt, amely egy lépéssel közelebb visz minket az alkalmazásunk befejezéséhez. Azt tanácsolom, hogy ha egyszer elkezdted, akkor az egész részt egy menetben fejezd be, mivel rövidek, és így megismerheted az egész koncepciót, amit megpróbálok bemutatni anélkül, hogy megszakadna az áramlásod.

A referenciádhoz az általunk épített alkalmazás végleges kódját ebben a GitHub repóban találod.

Egy üres React Native projekt beállítása

GYőződj meg róla, hogy telepítve van az Xcode 7.0 vagy magasabb verziója. ingyenesen letölthető az App Store-ból.

Valószínűleg (ha webfejlesztő vagy és ezt 2016-ban olvasod) már telepítve van a Node. De ha ez nem így van, menj előre és telepítsd a Node-ot is. Egy másik fontos eszköz, amire szükségünk lesz, az npm. A Node telepített npm-mel érkezik; ezt azonban frissítened kell, mivel elég gyakran frissül. Kövesse ezt a telepítési útmutatót.

Ez minden, amire szükségünk lesz. Most a terminálból futtassuk le a npm install -g react-native-cli. Ez globálisan telepíti a React Native-ot a rendszeredre.

Ha minden túlságosan újnak tűnik számodra, vagy csak egy kicsit elveszettnek érzed magad az egész telepítési folyamatban, a hivatalos kezdeti útmutató mindig ott van, hogy segítsen neked.

Keresd meg egy jó helyet a számítógépeden, ahol a projektet szeretnéd beállítani. Ha ott vagy, a terminálból futtasd a react-native init SplashWalls.

Ezzel le kell hívnod és telepítened kell az összes szükséges modult, és létre kell hoznod egy új mappát SplashWalls néven.

A SplashWalls mappa tartalma.

A React Native egyik nagyszerű tulajdonsága, hogy Android és iOS alkalmazásokat is írhatsz együtt, a JavaScript kód nagy része közös közöttük. Az újonnan létrehozott mappában két .js fájlt találunk: index.android.js és index.ios.js – a nevek maguktól értetődőek. Ha iOS-alkalmazást készítünk, akkor az index.ios.js-sel fogunk dolgozni; az index.android.js-sel Android-alkalmazás esetén; és mindkettővel, tudod, mindkét platform esetén.

Mivel iOS-alkalmazást építünk, a bemutató kedvéért és a tisztaság érdekében teljesen megszabadulunk az index.android.js és az android mappától. index.ios.js az a fájl, amivel dolgozni fogunk. Ez az a fájl, amely az alkalmazás indításakor először végrehajtódik.

Következő lépésként menjünk át az ios mappába, és indítsuk el a SplashWalls.xcodeproj fájlt.

Egy Xcode ablakot kell látnunk, mint az alábbiakban látható.

Xcode első indításkor.

Figyeljünk a fenti képen látható figyelmeztetésre: “No matching provisioning profiles found”. Javítsuk ki ezt.

Először is, változtassuk meg a Bundle Identifier mező szövegét valami egyéni szövegre. Ügyelnie kell arra, hogy bármit is ír be, az kövesse a fordított DNS konvenciót, amelyben a szervezet tartományneve fordítva szerepel, és további azonosítókkal egészül ki. Ez a konvenció segít megkülönböztetni az alkalmazásodat a többitől az eszközön és az App Store-ban. Én a com.nashvail.me.tutorial.SplashWalls nevet fogom használni; egyszerűen helyettesítse a saját nevét az enyém helyett, ha úgy tűnik, nem tud valamit kitalálni.

A következő lépésben válassza ki a nevét a csapat legördülő listából.

Válassza ki a csapat nevét.

Kattintson a Fix Issue-ra.

Ha már itt vagyunk, vegye észre a Deployment Info részt. Itt néhány alapértelmezett beállítás van alkalmazva.

Eredeti telepítési info beállítások.

Változtassuk meg a beállításokat a következők szerint:

Eredeti telepítési info beállítások.

Az alkalmazást csak portréra állítjuk, és az állapotsort is elrejtjük.

Lépjünk előre, és nyomjuk meg a Futtatás gombot az Xcode bal felső részén. Ezzel egy olyan terminálablakot indítunk el, mint amilyen az alábbiakban látható. A kezdeti átalakítás egy kis időt vesz igénybe.

Terminálablak az első futtatáskor.

Amint kész, a szimulátorban a következő kimenetet kell látnia:

Simulátor az első indításkor.

És ezzel befejeztük a legelső szakaszunkat.

Háttérképadatok lekérése az API-ból

Ebben a szakaszban az Unsplash.it API-t fogjuk hívni, háttérképadatokat kérve. Mielőtt azonban belevágnánk az érdekes munkába, némi előkészítésre van szükség.

Switching To ES2015 Class Syntax

Az index.ios.js fájl megnyitásakor észrevehetjük, hogy néhány kezdeti kód már jelen van. Ez a kód felelős a szimulátorban megjelenő kimenetért (előző kép).

Az index.ios.js fájlban figyeljük meg a var SplashWalls = React.createClass({ … }) kódsort. Ezt fogjuk módosítani. Ehhez a bemutatóhoz az ES2015 class szintaxisát fogjuk használni.

Mi fejlesztők kíváncsi lelkek vagyunk. Tudom, hogy biztosan azt kérdezed: Miért? Miért váltunk a class szintaxisra?

Ez mind személyes preferencia kérdése. Korábban sokat programoztam objektumorientált nyelveken, és a class egyszerűen ismerősebbnek tűnik számomra. Ráadásul a class használatával a kódot is egy kicsit tisztábban tartod, mivel nem kell vesszőket tenned minden egyes metódusdeklaráció után.

A másik oldalon, ha a class-t választod, nem kapsz olyan funkciókat, mint az automatikus kötés vagy a isMounted metódushoz való hozzáférés, ami egyáltalán nem rossz dolog, mivel nem igazán fogod magad veszteségben találni, ha nem használod ezeket.

Bármelyik utat is választod, végül is egy osztályt hozol létre. Az én tanácsom a class használata lenne. Ez egy új funkció, és előbb-utóbb úgyis az ES2015-öt fogod használni. És ha ezt a bemutatót követed, akkor kénytelen leszel a class-t használni – nincs igazán más választásod!

Ha többet szeretnél megtudni erről, fontold meg a “React.Component vs React.createClass” elolvasását Naman Goel és Zach Silveira tollából.

Amikor elvégezted a szükséges változtatásokat, a kódblokknak most már a következőképpen kell kinéznie:

class SplashWalls extends Component{ render() { return ( . <View style={styles.container}> <Text style={styles.welcome}> Welcome to React Native! </Text> <Text style={styles.instructions}> To get started, edit index.ios.js </Text> <Text style={styles.instructions}> Press Cmd+R to reload,{'\n'} Cmd+D or shake for dev menu </Text> .</View> ); }};

A Reacthez újonnan érkező emberek számára a return zárójelben lévő kód egy kicsit furcsának tűnhet, de ez nem rakétatudomány, csak a jó öreg XML-szerű szintaxis, az úgynevezett JSX. Bővebben itt olvashatsz róla.

A class előtti megvalósításhoz képest a var szintaxis eltűnt. Emellett az render: function(){… most már csak render(){….

Hé! De mi az a Component, amit kiterjesztesz? És jogosan kérdezed. Ha most futtatnád a projektet az Xcode-ban, hibaüzenetet kapnál, miszerint a Component nincs definiálva. Itt két dolgot tehetsz: lecseréled a Component-t React.Component-ra; vagy hozzáadsz egy új sort a (lentebb látható) blokkon belül a fájl tetején.

Ebben és a későbbi kódpéldákban az újonnan hozzáadott sorokat //-vel veszem körül, hogy könnyebben össze tudd hasonlítani az általad írt kódot az itt láthatóval. Csak arra ügyelj, hogy ha kódot másolsz a mintákból, akkor ne a //-et másold a tényleges kóddal együtt. Mivel a JSX nem támogatja a /***/ megjegyzéseket, az alkalmazás összeomlásához vezet, ha ezeket beilleszted a JSX kódodba.

var { AppRegistry, StyleSheet, Tex .t, View, /***/ Component /***/} = React;

A fenti kódblokk csupán néhány billentyűleütést takarít meg. Ha például nem vennéd fel ezeket a kódsorokat a tetejére, akkor a AppRegistry helyett React.AppRegistry-t kellene írnod minden alkalommal, amikor ezt szeretnéd megtenni. Elég király! Ugye? Oké, nem annyira.

Menj vissza az Xcode-ba, és futtasd le a projektet még egyszer, hogy megbizonyosodj róla, hogy nem törtél el semmit a folyamat során.

Minden rendben? Nagyszerű! Lépjünk tovább.

A SplashWalls osztályon belül az első dolog, amit tennünk kell, az egy konstruktor hozzáadása. A konstruktoron belül inicializáljuk az állapotváltozóinkat. Az egyetlen két állapotváltozó, amire ezen a ponton szükségünk lesz, az egy tömb – wallsJSON – ami az API-ból lehívott összes JSON adatot fogja tárolni, és a isLoading, ami egy Boolean változó, ami azt jelenti, hogy egy true vagy false értéket fog tartani. Ennek az állapotváltozónak a megléte segíteni fog nekünk abban, hogy megjelenítsük és elrejtsük a betöltési képernyőt attól függően, hogy az adatok betöltésre kerültek-e vagy sem.

A SplashWalls osztályon belül adjuk hozzá a constructor-t az alábbiakban látható módon.

class SplashWalls extends Component{/***/ constructor(props) { super(props); this.state = { wallsJSON: , isLoading: true }; }/***/...}

A következőkben definiálunk egy fetchWallsJSON metódust, amely, nos, azt teszi, amit mond. Hagyjunk pár sort a konstruktor záró zárójel alatt, és adjuk hozzá a következő kódsorokat:

fetchWallsJSON() { console.log('Wallpapers will be fetched');}

Azt szeretnénk, hogy ez a függvény akkor lépjen működésbe, ha a komponensünk sikeresen fel lett szerelve. Adjuk hozzá a componentDidMount metódust. A legtöbb leírt metódus a SplashWalls osztályon belülre kerül – nem felejtem el megemlíteni, mikor nem.

componentDidMount egy életciklus metódus, amely az első renderelés után azonnal elsül.

Az első renderelési életciklus metódus hívássorozata. (Image credit: TutorialHorizon)

Itt egy jó magyarázat a React komponens összes életciklus metódusáról. Csak ne feledjük, hogy mivel az újabb class szintaxist használjuk, kihagyhatjuk a getInitialState metódust. Ezt egy this.state változó deklarációval helyettesítjük a constructor-ban.

A metódusokat az osztályon belül érdemes tisztán rendszerezni. Én szeretem az összes egyéni metódust elkülöníteni az életciklus metódusoktól. Neked is ezt kellene tenned.

Deklaráljuk a componentDidMount:

componentDidMount() { this.fetchWallsJSON();}

Figyeljük meg, hogy a fetchWallsJSON metóduson belül bejelentkeztettünk egy üzenetet a konzolra – de hol van a konzol? Tartsunk ki.

Vigyázzunk, hogy a szimulátor ablak legyen kijelölve, és nyomjuk le a Cmd + Control + Z billentyűkombinációt, majd a megjelenő menüből válasszuk a Debug in Chrome menüpontot. Ez megnyit egy új lapot. Miközben ugyanabban a fülben vagy, menj át a Dev Tools-ra (Option + Cmd + J). A konzolon a “Wallpapers will be fetched” üzenetet találja.”

Logged message in the console.

Maradjon egyelőre nyitva a debugger. Látogasson el az unsplash.it/listára egy új lapon. Látnia kell, hogy a teljes nézetablak megtelik egy JSON tömbtel. A tömb minden eleme egy JavaScript-objektum, amely egyetlen háttérkép adatait tartalmazza. Ezeken az adatokon fogunk átszűrni, és véletlenszerű háttérképeket ragadunk ki belőlük.

Először is tegyük meg, hogy a fetchWallsJSON ne csak egy üzenetet logoljon a konzolra.

 fetchWallsJSON() { /***/ var url = 'http://unsplash.it/list'; fetch(url) .then( response => response.json() ) .then( jsonData => { console.log(jsonData); }) .catch( error => console.log('Fetch error ' + error) ); /***/ }

Frissítsük újra a szimulátort (Cmd + R), vagy jobb, ha engedélyezzük az élő újratöltést a Cmd + Ctrl + Z billentyűkombinációval és az Enable live reload (Élő újratöltés engedélyezése) menüpont kiválasztásával. Az élő újratöltés engedélyezésével nem kell minden alkalommal frissítenie a szimulátort, amikor változtat a kódján. Csak mentse el az IDE-ben, és a szimulátor automatikusan frissül. Ha valaha is fejlesztettél már alkalmazást az Xcode vagy az Android Studio programban, akkor ezt a funkciót különösen lenyűgözőnek fogod találni, mivel nem kell minden egyes változtatásnál megnyomnod a Futtatás gombot és újrafordítanod az alkalmazást. Ezek az apróságok sokkal vonzóbbá teszik a React Native-ot.

A frissítéskor, néhány másodperc várakozás után a következő kimenetet kell látnunk a konzolon:

A letöltött adatok naplózva a konzolon.

Jó, most már képesek vagyunk lekérni a háttérképek JSON-adatait az API-ból. Mint észrevehetted, van egy kis késleltetés, mielőtt az adatok naplózódnak a konzolra. Ez azért van, mert a háttérben az adatok letöltődnek a szerverekről, ami időbe telik.

Ez tökéletes alkalomnak tűnik egy betöltőképernyő hozzáadására.

Betöltőképernyő hozzáadása

A szakasz végére megjelenik egy betöltőképernyő, miközben a JSON adatok letöltése zajlik.

Először is szabaduljunk meg mindentől a SplashWall osztály render metódusán belülről, és adjuk hozzá ezeket a kódsorokat:

 render() { var {isLoading} = this.state; if(isLoading) return this.renderLoadingMessage(); else return this.renderResults(); }

Két új metódusunk van. Deklaráljuk őket is, ha már itt tartunk

 renderLoadingMessage() { return ( . <View style={styles.loadingContainer}> <ActivityIndicatorIOS animating={true} color={'#fff'} size={'small'} style={{margin: 15}} /> <Text style={{color: '#fff'}}>Contacting Unsplash</Text> .</View> ); } renderResults() { return ( . <View> <Text> Data loaded </Text> .</View> ); }

Attól függően, hogy a isLoading állapotváltozó milyen értéket tartalmaz, két különböző View komponens fog megjeleníteni. Ha isLoading igaz, akkor egy betöltő spinnert jelenítünk meg, amelyet a “Contacting Unsplash” szöveg követ; ha isLoading hamis (ami azt jelenti, hogy az adatok betöltődtek), akkor az eredményeket jelenítjük meg, ami jelen pillanatban csak egy Text komponens, amely azt mondja: “Data loaded”.

De itt valamit kihagyunk: nem változtatjuk meg a isLoading értékét, miután az adataink letöltődtek. Pontosan ezt tegyük meg. Menjünk át a fetchWallsJSON metódushoz, és a jsonData-t a konzolra naplózó sor alatt adjunk hozzá egy extra sort, hogy frissítsük a isLoading-t.

 fetchWallsJSON() { var url = 'http://unsplash.it/list'; fetch(url) .then( response => response.json() ) .then( jsonData => { console.log(jsonData); /***/ this.setState({isLoading: false}); //update isLoading /***/ }) .catch( error => console.log('Fetch error ' + error) ); }

A setState a React komponens API egyik metódusa. Ez az elsődleges módszer a felhasználói felület frissítésének kiváltására.

Megjegyezzük, hogy a renderLoadingMessage-ban van egy új komponensünk: ActivityIndicatorIOS (egyszerűen fogalmazva, a pörgettyű). Ezt a komponenst importálnunk kell, mielőtt használni tudjuk. Emlékszel, amikor a Component importálásakor megspóroltunk néhány billentyűleütést? Pontosan ezt kell tennünk.

var { AppRegistry, StyleSheet, Tex .t, View, Component,/***/ ActivityIndicatorIOS // Add new component/***/} = React;

Még egy dolgot meg kell tennünk, mielőtt láthatnánk az eredményeket. Vegyük észre, hogy a ActivityIndicatorIOS-ot tartalmazó View stílusa styles.loadingContainer-re van állítva. Ezt meg kell határoznunk. Keressük meg a var styles = StyleSheet.create({… feliratú sort. Itt látni fogod, hogy már van néhány stílus definiálva. Ezek a stílusok felelősek a kezdeti “Welcome to React Native” üzenet stílusáért a szimulátorban. Szabaduljunk meg az összes előre definiált stílustól, és csak egyet adjunk hozzá a loadingContainer-hoz, ahogy a képen látható.

var styles = StyleSheet.create({/***/ loadingContainer: { flex: 1, flexDirection: 'row', justifyContent: 'center', alignItems: 'center', backgroundColor: '#000' }/***/});

A React Native-ban a komponensekre alkalmazott összes stílus a fent látható módon van deklarálva. A StyleSheet.create egy stílusokat tartalmazó JavaScript objektumot vesz fel argumentumként, majd a stílusok a dot operátorral érhetők el. Például a következő módon alkalmaztuk a stílust a View wrapperre:

<View style={styles.loadingContainer}/>

A stílusokat inline is deklarálhatjuk:

<View style={{ flex: 1, flexDirection: 'row', justifyContent: 'center', alignItems: 'center', backgroundColor: '#000' }} />

Ez azonban kissé rendezetlenné teszi a kódunkat. Ha egy komponensre több stílust alkalmazunk, mindig jó ötlet ezeket egy változóban tárolni.

A stílusok nagyon hasonlítanak a CSS-re, nem igaz? Tudod miért? Mert annak kell lenniük – nem különböznek semmiben. Ez még egyszerűbbé teszi a React Native-ot a webfejlesztők számára. Amikor egy dedikált IDE-ben (például az Xcode-ban) építesz egy alkalmazást, egy StoryBoardot kapsz, hogy közvetlenül a képernyőre húzd és pozicionáld az UI-elemeket, például a gombokat és a címkéket. A React Native-ban ezt nem teheti meg, ami – higgye el – egyáltalán nem rossz dolog.

A React Native erősen használja a flexboxot az elemek képernyőn való elhelyezéséhez. Ha már ismered a flexboxot, az elemek pozicionálása gyerekjáték. Én minden nap előnyben részesítem a flexbox elrendezést a StoryBoarddal szemben, pont. Ez csak egy olyan dolog, amit magadnak kell kipróbálnod, hogy meg tudd állapítani a különbséget.

Mentsd el a változtatásokat, menj át a szimulátorba, és nyomd meg a Cmd + R billentyűt. Meg kell látnod a betöltési képernyőt.

Betöltési képernyő, amit most fejeztünk be.

Pár másodperc múlva meg kell látnod a képernyőt, amelyen az áll: “Data loaded”.

Az adat betöltődött üzenet látható, amint az adatok betöltése befejeződött.

Szűrés és véletlenszerű háttérképek kiválasztása

Ebben a részben a háttérképadatokon fogunk szűrni, és meghatározott számú véletlenszerű háttérképet fogunk kiválasztani.

Ez a rész inkább a JavaScriptre, mint a React Native-ra fog koncentrálni. Végigmegyünk egy új modul (fájl) létrehozásán, amely a véletlen számok generálását fogja kezelni. Ha a modulok JavaScriptben újnak hangzanak számodra, fontold meg, hogy átnézed a Node.js modules docs-t.

Menj a class deklaráció feletti sorba, és deklarálj egy új konstanst, amely megmondja az alkalmazásnak, hogy hány véletlen háttérképet válasszon; legyen öt.

const NUM_WALLPAPERS = 5;

Most létrehozunk egy modult, amely segíteni fog nekünk a véletlen számok generálásában. Ez a modul két függvényt fog exportálni. Nézzük meg mindegyiket.

  • uniqueRandomNumbers: Ez a függvény három argumentumot vesz fel. Az első a visszaadandó véletlenszámok száma. A következő két argumentum meghatározza azt a tartományt, amelyben a véletlen számokat vissza kell adni, nevezetesen lowerLimit és upperLimit. Ha a uniqueRandomNumbers(5, 10, 20) függvényt hívja meg, akkor egy 10 és 20 közötti öt egyedi véletlen számból álló tömböt kap vissza.
  • randomNumberInRange: Ez a függvény két argumentumot vesz fel, amelyek meghatározzák az alsó és a felső határt, amelyek között egyetlen véletlen számot ad vissza. Ha például a randomNumberInRange(2, 10) függvényt hívjuk, akkor egy 2 és 10 közötti egyedi véletlenszámot kapunk vissza.

Ezeket a két függvényeket összevonhattuk volna egybe, de mivel én a jó minőségű kód hirdetője vagyok, az egyetlen felelősség elvét követem. Az SRP többé-kevésbé azt mondja ki, hogy minden függvénynek egy dolgot kell jól csinálnia, és semmi mást nem szabad csinálnia. A jó programozási elvek követése számos későbbi fejfájástól kíméli meg az embert.

Készítsen egy új fájlt ugyanabban a könyvtárban, mint az index.ios.js. Ha akarnánk, ezeket a függvényeket az index.ios.js-be is elhelyezhetnénk, de gondoljunk csak bele: ahhoz a fajta célhoz, amit ez az új fájl szolgál, egyszerűen bemásolhatjuk ezt a fájlt, és beilleszthetjük bármelyik új projektünkbe, amely véletlen számok generálását igényli, és onnan használhatjuk. Emellett így az index.ios.js állományon belüli kód is sokkal tisztább marad.

Nevezzük el a fájlt RandManager.js-nek. Az alábbiakban látható a tartalma:

module.exports = { uniqueRandomNumbers(numRandomNumbers, lowerLimit, upperLimit) { var uniqueNumbers = ; while( uniqueNumbers.length != numRandomNumbers ) { var currentRandomNumber = this.randomNumberInRange(lowerLimit, upperLimit); if( uniqueNumbers.indexOf(currentRandomNumber) === -1 ) uniqueNumbers.push(currentRandomNumber); } return uniqueNumbers; }, randomNumberInRange(lowerLimit, upperLimit) { return Math.floor( Math.random() * (1 + upperLimit - lowerLimit) ) + lowerLimit; }};

Ne felejtsük el megkövetelni a RandManager modult az index.ios.js-ben. Csak add hozzá: var RandManager = require('./RandManager.js'); a use strict; utasítás alá. Miután a RandManager készen áll, a következő változtatásokat végezzük el a fetchWallsJSON függvényünkön:

fetchWallsJSON() { var url = 'http://unsplash.it/list'; fetch(url) .then( response => response.json() ) .then( jsonData => { /***/ var randomIds = RandManager.uniqueRandomNumbers(NUM_WALLPAPERS, 0, jsonData.length); var walls = ; randomIds.forEach(randomId => { walls.push(jsonData); }); this.setState({ isLoading: false, wallsJSON: .concat(walls) }); /***/ }) .catch( error => console.log('JSON Fetch error : ' + error) );}

Mihelyt megvan a jsonData, egyedi véletlen számokat kérünk le a RandManager-ből és tároljuk a randomIds tömbben. Ezután ciklusban végigmegyünk ezen a tömbön, felvesszük az adott randomId-nál jelenlévő háttérképes adatobjektumokat, és a walls tömbben tároljuk őket.

Ezután frissítjük az állapotváltozóinkat: isLoading false-ra, mivel az adatok letöltése megtörtént; és wallsJSON walls-ra.

Az eredmények megtekintéséhez módosítsuk a renderResults függvényt, hogy a következőre hasonlítson:

renderResults() {/***/ var {wallsJSON, isLoading} = this.state; if( !isLoading ) { return ( . <View> {wallsJSON.map((wallpaper, index) => { return( <Text key={index}> {wallpaper.id} </Text> ); })} .</View> ); }/***/}

A legelső sorban a renderResults belsejében egy új ES2015 funkciót használunk, amit destructuring-nek hívunk. A destructuring segítségével sikerült helyettesíteni:

var wallsJSON = this.state.wallsJSON, isLoading = this.state.isLoading;

azzal:

var {wallsJSON, isLoading} = this.state;

ES2015 elég király, én mondom neked.

Ezután a View-en belül a map segítségével végighaladunk a lekért wallsJSON adatokon. Amikor a JSX-ben egy gyűjteményen akarsz végighaladni, akkor a map konstrukciót használod.

Azt is, amikor egy tömbön vagy gyűjteményen végighaladsz és egy komponenst renderelsz, a React Native megköveteli, hogy adj egy key, egy egyedi azonosítót minden egyes renderelt gyermekkomponensnek. Ezért látható egy kulcs tulajdonság a

<Text key={index}>

A szimulátor frissítése után…

Véletlenszerűen generált azonosítók láthatóak, amint az adatok betöltése befejeződik.

Öt különböző véletlenszerű háttérkép-azonosítót látunk megjelenítve. Változtassuk meg a {wallpaper.id}-t {wallpaper.author}-ra a renderResults-ban, és valami olyasmit kell látnunk, mint a következő.

A véletlenszerű azonosítóknak megfelelő szerzői nevek.

Nagyszerű! Most már beszélhetünk. Most már képesek vagyunk a megadott számú (jelen esetben öt) véletlenszerű háttérképet lekérni és szűrni az API-ból. Úgy tűnik, ezzel a résszel végeztünk. High five!

A Swiper komponens hozzáadása

Ebben a szakaszban egy Swiper komponenst fogunk beépíteni az alkalmazásunkba. Ez a komponens lehetővé teszi számunkra, hogy háttérképeket jelenítsünk meg egy lehúzható konténerben.

Megtanuljuk, hogyan illesszünk be egy harmadik féltől származó React Native komponenst az alkalmazásunkba. A React Native elképesztő közösségi támogatással rendelkezik, és a GitHubon gazdag gyűjteménye van mindenféle különböző harmadik féltől származó komponenseknek.

Céljainkra a react-native-swiper-t fogjuk használni.

Lépjünk a terminálban a projekt könyvtárába, és futtassuk a következő parancsot:

npm install react-native-swiper --save

Most igényeljük a Swiper komponenst: adjunk hozzá var Swiper = require('react-native-swiper'); a use strict alá.

Próbáljuk ki az újonnan bevont Swiper komponensünket.

Menjünk a renderResults módszerhez, és cseréljük le a View-et Swiper-ra. Ezt követően a renderResults-nak így kell kinéznie:

renderResults() { var {wallsJSON, isLoading} = this.state; if( !isLoading ) { return ( /***/ <Swiper> /***/ {wallsJSON.map((wallpaper, index) => { return( <Text key={index}> {wallpaper.author} </Text> ); })} /***/ </Swiper> /***/ ); }}

Ezzel a következő eredményt kapjuk:

Minden szerző neve egy saját konténerben látható.

Ahelyett, hogy a szerzők neveit listaként jelenítenénk meg, egy swiperben helyeztük el őket, amely minden háttérképnek egy saját képernyőt ad, amelyen átlapozhatunk. Itt még néhány dolgot meg kell tennünk: a Swiper komponenshez a következő attribútumokat adjuk hozzá a képen látható módon.

<Swiper/***/dot.{<View style={{backgroundColor:'rgba(255,255,255,.4)', width: 8, height: 8,borderRadius: 10, marginLeft: 3, marginRight: 3, marginTop: 3, marginBottom: 3,}} />}activeDot.{<View style={{backgroundColor: '#fff', width: 13, height: 13, borderRadius: 7, marginLeft: 7, marginRight: 7}} />}loop={false} {wallsJSON.map((wallpaper, index) => { return( <Text key={index}> {wallpaper.author} </Text> ); })} </Swiper>

Ezzel:

  • Stílusosítja a lapozási pontokat (az előző képen alul látható kék pontokat fehérré és nagyobbá teszi).
  • Kikapcsolja a folyamatos lapozgatást (loop={false}). Azaz, ha elérjük az utolsó oldalt, és tovább lapozunk, nem kerülünk vissza az első háttérképre.
  • Mindig elsüti a onMomentumScrollEnd (amivel a bemutató következő részében mélyebben foglalkozunk), amikor befejezzük a lapozást.

Ezzel az első rész végére értünk. Micsoda utazás!

A React Native bemutató összefoglalása

  • Az első részben megtanultuk, hogyan kell létrehozni egy üres React Native projektet az Xcode-ban.
  • A második részben az ES2015 osztályokról beszéltünk, és arról, hogy miért érdemes az újabb szintaxist előnyben részesíteni, valamint az állapotváltozók létrehozásáról és a nyers adatok lekéréséről az API-ból.
  • A harmadik részben az alkalmazás dinamikus megjelenítését tekintettük át az állapotváltozó értéke alapján. Emellett végeztünk némi könnyű flexbox pozicionálást is.
  • A negyedik szakaszban létrehoztunk egy vadonatúj modult a véletlenszám-generálás kezelésére, és átnéztük a főfájlba való beépítését is.
  • Az utolsó szakaszban hozzáadtuk az első harmadik féltől származó komponenst az alkalmazásunkhoz, ami a Node-nak köszönhetően gyerekjáték volt.

Előtte, hogy őszinte legyek, az alkalmazásunk nem néz ki túl különlegesen. Tudom. A következő részben tényleges képeket fogunk hozzáadni a szerzők nevei helyett. Nem csak ezt, hanem néhány haladó dolgot is fogunk csinálni, mint például egy egyéni dupla érintés érzékelő létrehozását a PanHandler API segítségével. Megtanulod, hogyan köss össze egy könyvtárat az Xcode-ban, és hogyan adj hozzáférést az alkalmazásodnak a Camera Rollhoz. Létrehozzuk a saját komponensünket is, és még sok minden mást. Érdekesen hangzik? Találkozunk a következő részben.

(da, ml, og, il)

Vélemény, hozzászólás? Kilépés a válaszból

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

Archívum

  • 2022 január
  • 2021 december
  • 2021 november
  • 2021 október
  • 2021 szeptember

Meta

  • Bejelentkezés
  • Bejegyzések hírcsatorna
  • Hozzászólások hírcsatorna
  • WordPress Magyarország
  • DeutschDeutsch
  • NederlandsNederlands
  • SvenskaSvenska
  • DanskDansk
  • EspañolEspañol
  • FrançaisFrançais
  • PortuguêsPortuguês
  • ItalianoItaliano
  • RomânăRomână
  • PolskiPolski
  • ČeštinaČeština
  • MagyarMagyar
  • SuomiSuomi
  • 日本語日本語

Copyright Trend Repository 2022 | Theme by ThemeinProgress | Proudly powered by WordPress