Common React Native App Layouts Calendar Page

In deze serie leert u hoe u React Native gebruikt om paginalay-outs te maken die vaak worden gebruikt in mobiele apps. De lay-outs die je gaat maken, zullen niet functioneel zijn, in plaats daarvan is de belangrijkste focus van deze serie om je handen vuil te maken bij het leggen van inhoud in je React Native apps. 

Als je nog onbekend bent met het uitbrengen van React Native-apps of styling in het algemeen, bekijk dan mijn vorige tutorial:

Om deze reeks te volgen, daag ik je uit om eerst zelf elk scherm opnieuw te maken voordat je mijn stapsgewijze instructies in de zelfstudie leest. Je zult niet echt veel baat hebben bij deze tutorial door het te lezen! Probeer eerst eerst de antwoorden op te zoeken. Als het je lukt om het op het originele scherm te laten lijken, vergelijk je je implementatie met de mijne. Bepaal dan zelf welke beter is!

In dit tweede deel van de serie maakt u de volgende kalenderpagina:

Agenda-apps worden gebruikt om gebeurtenissen en afspraken bij te houden die door de gebruiker zijn toegevoegd. Je zult verschillende variaties in de natuur vinden, maar de meeste zullen dezelfde elementen hebben als een fysieke kalender: de huidige maand en het huidige jaar, de dagen in de maand en de evenementen of afspraken die door de gebruiker zijn toegevoegd.

Hier zijn een paar voorbeelden van dit type lay-out:

Project Setup

De eerste stap is natuurlijk om een ​​nieuw React Native-project op te zetten:

react-native init react-native-common-screens

Zodra het project is ingesteld, opent u de index.android.js bestand en vervang de standaardcode door het volgende:

import Reageren, Component uit 'reageren'; importeer AppRegistry van 'react native'; agenda importeren uit './src/pages/Calendar'; export standaardklasse ReactNativeCommonScreens verlengt Component render () return (  );  AppRegistry.registerComponent ('ReactNativeCommonScreens', () => ReactNativeCommonScreens);

Maak een src / pages map en maak een Calendar.js bestand erin.

Je hebt ook de reactie-natief-vector-icons pakket. Dit wordt specifiek gebruikt voor de navigatiepictogrammen en andere pictogrammen die op de pagina nodig zijn.

npm install - save-native-vector-pictogrammen opslaan

Open de android / app / build.gradle bestand en voeg een referentie toe aan het pakket:

afhankelijkheden // rest van de afhankelijkheden bevinden zich hier in het bovenste compileerproject (': react-native-vector-icons') // voeg dit toe

Doe hetzelfde met de android / settings.gradle bestand door het volgende onderaan toe te voegen:

include ': react-native-vector-icons' project (': react-native-vector-icons'). projectDir = nieuw bestand (rootProject.projectDir, '... / node_modules / react-native-vector-icons / android')

Open android / app / src / main / java / com / reactie-native-common-schermen / MainApplication.java en importeer het pakket:

import java.util.Arrays; importeer java.util.List; import com.oblador.vectoricons.VectorIconsPackage; //Voeg dit toe

Ten slotte, initialiseer het pakket: 

@Override beschermde lijst getPackages () Arrays retourneren.asList (nieuw MainReactPackage (), nieuw VectorIconsPackage () // dit toevoegen); 

De kalenderpagina maken

Oké, nu je hebt geprobeerd de lay-out zelf te coderen (geen valsspelen, toch?), Laat ik je zien hoe ik mijn implementatie heb gebouwd.

Eerst dacht ik dat dit de moeilijkste zou zijn om te implementeren, maar geloof me, het is echt niet zo ingewikkeld zolang je de basiskennis al kent. Hier zijn een aantal mogelijkheden om JavaScript-code te gebruiken om te helpen bij het renderen. 

Begin met het opnemen van alle componenten en pakketten die u nodig hebt:

import Reageren, Component uit 'reageren'; import StyleSheet, Text, View, ScrollView van 'react native'; importeer icoon uit 'react-native-vector-icons / FontAwesome'; importeer bereik van 'lodash'; import Knop van '... / components / Button';

Deze keer is er een nieuw pakket dat je nog niet hebt geïnstalleerd en dat is lodash. Je hebt niet echt de hele bibliotheek van de lodash nodig, alleen de reeks functie. Dit wordt gebruikt voor het genereren van een reeks getallen op basis van een specifiek bereik. U kunt alleen deze functie installeren door het uit te voeren npm install - sla lodash.range op op uw terminal.

Voeg de standaardcode voor het aanmaken van pagina's toe:

standaardklasse exporteren Kalender breidt component render () return (terug) uit ...  );  const styles = StyleSheet.create (container: flex: 1);

De kop bevat drie elementen: de knop om terug te gaan naar de vorige pagina, de titel van de huidige pagina en de tekst met een mensvriendelijke weergave van de momenteel geselecteerde datum.

   Kalender   Vandaag  

hoofd heeft een flexDirection van rij zodat elk header_item is horizontaal gestapeld. Hetzelfde buigen de waarde wordt aan elk van hen toegewezen, zodat ze evenveel ruimte innemen. text_center en text_right worden gebruikt om de tekst daarbinnen uit te lijnen header_items naar het midden en naar rechts. Dit gebeurt omdat ze standaard op de meest linkse zijde van hun container zijn uitgelijnd.

header: backgroundColor: '# 329BCB', flexDirection: 'row', padding: 20, header_item: flex: 1, header_button: flexDirection: 'row', text_center: textAlign: 'center', text_right : textAlign: 'right', header_text: color: '#fff', fontSize: 20, bold_text: fontWeight: 'bold',

Zodra de stijlen zijn toegevoegd, ziet het er nu als volgt uit:

De volgende is de eigenlijke kalender, die is verdeeld in drie delen: de kop, de dagen van de week en de kalenderdagen:

 ...  ...  ...  

Met de kalenderkop kan de gebruiker het jaar en de maand wijzigen. 

Er zijn op zijn minst twee manieren om dit te implementeren. De eerste methode is om elk element als een enkel item te behandelen en toe te passen justifyContent: 'ruimte-tussen' naar de container. De tweede methode is om alle elementen te groeperen die met het jaar te maken hebben en die groeperen die met de maand te maken hebben. 

De tweede methode is de methode die hieronder wordt toegepast. Semantisch gezien is dit logischer omdat de knop om een ​​jaar terug te navigeren, het jaar zelf en de knop om vooruit te navigeren allemaal gerelateerd zijn, dus u kunt ze als één ding behandelen door ze in dezelfde container te plaatsen. Hetzelfde geldt voor de maandbedieningen.

   2013     november   

Van daaruit kunt u dezelfde techniek toepassen op die twee groepen componenten in dezelfde regel. Om spaties toe te voegen tussen de twee knoppen (terug en vooruit) en het label, gebruiken we justifyContent: 'ruimte-tussen'. We gebruiken alignItems: 'center' om alle elementen erin naar het midden te duwen. Ten slotte voegen we links en rechts opvulling toe om meer ruimte tussen de twee groepen toe te voegen.

calendar_header: flexDirection: 'row', calendar_header_item: flex: 1, flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', paddingTop: 20, paddingRight: 40, paddingLeft: 40, calendar_header_text: fontWeight: 'bold', fontSize: 20,

Volgende zijn de weekdagen. We gebruiken een functie om deze te renderen omdat het het beste is om een ​​JavaScript-code te gebruiken om alle elementen te renderen.

 this.renderWeekDays () 

Dus in plaats van zeven Uitzicht of Tekst componenten die elke dag van de week weergeven, kunt u gewoon een array hebben met de dagen van de week. U kunt dan door die dagen heengaan met behulp van de Array.map () functie. Geef voor elke iteratie een Tekst component dat de dag laat zien. 

renderWeekDays () laat weekdagen = ['zon', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; return weekdays.map ((day) => return ( Day.toUpperCase () ); ); 

Merk op dat in de bovenstaande code de toUpperCase () functie wordt gebruikt om alle letters van elke dag naar hoofdletters om te zetten. React Native komt niet met de text-transform CSS-eigenschap, dus dit is de enige manier om hoofdletters te krijgen, afgezien van het handmatig gebruiken van hoofdletters.

Dit is de stijl voor de kalenderkop:

calendar_weekdays_text: flex: 1, color: '# C0C0C0', textAlign: 'center',

De kalenderdagen gebruiken ook een functie voor het renderen van de dagen:

 this.renderWeeks () 

De renderWeeks () functie gebruikt de range () functie in lodash om een ​​array te genereren met de dagen van de laatste maand en de dagen van de huidige maand. Die twee matrices worden vervolgens samengevoegd. 

U kunt de resulterende array echter niet rechtstreeks gebruiken als gegevensbron voor de kalenderdagen. Dat komt omdat als je gewoon door de items loopt en output a Tekst component voor elke dag, zal er geen onderscheid tussen elke week zijn. Je weet al dat je elke kalenderdag inline moet aanmelden flexDirection: 'rij' naar de container. Als u het op een enkele container toepast, zou dit ertoe leiden dat alle kalenderdagen op één regel staan. 

Dit betekent dat u voor elke week een afzonderlijke container nodig heeft. De vraag is hoe. Nogmaals, er zijn minstens twee manieren om dit te bereiken. 

De eerste methode is om een ​​variabele op te slaan hoeveel dagen momenteel worden uitgevoerd en vervolgens een voorwaardelijke instructie toe te voegen die een opening zal weergeven  elke keer dat de variabele bevat 0 en een afsluiting  elke keer dat het is 7. Zodra het is 7, reset het terug naar 0. Dit is de meest eenvoudige methode.

Maar ik zal hier een andere methode gebruiken. Onder de getWeeksArray () functie wordt gebruikt om het te implementeren. Deze functie accepteert de reeks dagen en groepeert deze in arrays die elk zeven dagen bevatten. Van daaruit kunt u door elk van die arrays lopen om de weekcontainer weer te geven. Vervolgens doorloop je voor elke iteratie opnieuw de dagen in de week om de dagen weer te geven. Dit is wat de renderDays () functie doet.

renderWeeks () let past_month_days = range (27, 31); laat this_month_days = bereik (1, 30); let days = past_month_days.concat (past_month_days, this_month_days); laat grouped_days = this.getWeeksArray (dagen); return grouped_days.map ((weekdagen, index) => return (  this.renderDays (week_days)  ); ); 

Hier is de getWeeksArray () functie:

getWeeksArray (dagen) var weeks_r = []; var seven_days = []; var count = 0; days.forEach ((dag) => count + = 1; seven_days.push (day); if (count == 7) weeks_r.push (seven_days) count = 0; seven_days = [];); terugkeer weken_r; 

En hier is de renderDays () functie:

renderDays (week_dagen) return week_days.map ((day, index) => return ( 

Voeg de styling toe voor elke week (doordeweekse dagen) en dag (dag en day_text):

weekdagen: flexDirection: 'rij', dag: flex: 1, backgroundColor: '# F5F5F5', opvulling: 17, marge: 2, day_text: textAlign: 'center', color: '# A9A9A9', fontSize : 25,

Volgende is de notitie die door de gebruiker is toegevoegd voor de momenteel geselecteerde dag en de geselecteerde datum en tijd. Nogmaals, het is beter om elementen te groeperen op basis van hun doel in plaats van hoe ze op de pagina worden geplaatst. Zeker al deze elementen zijn gerelateerd, dus we zullen ze in dezelfde container plaatsen. Maar als u beter kijkt, begint u te zien dat u ze verder kunt groeperen: de eigenlijke notitie en de geselecteerde datum. Met dat in gedachten, hier is de markup waar je uiteindelijk mee eindigt:

  Met mijn fiets door de buurt rijden.   8:23 PM 14    DONDERDAG   

De geselecteerde datum neemt minder ruimte in beslag dan de notitie, dus je moet een grotere toepassen buigen waarde voor de notities. flex: 3 en flex: 1 worden in dit geval gebruikt, wat betekent dat de noten 3/4 van de beschikbare ruimte innemen en dat de geselecteerde datum 1/4 is. U kunt ook decimalen gebruiken (0.75 en 0.25) als dat logischer is voor jou. Wat belangrijk is, is een standaard kiezen en eraan vasthouden. alignItems: 'flex-end' wordt gebruikt op notes_selected_date zodat al zijn kinderen op één lijn worden gebracht met het recht. Dit is nodig omdat ze standaard links zijn uitgelijnd.  

opmerkingen: marginTop: 10, opvulling: 20, borderColor: '# F5F5F5', borderTopWidth: 1, borderBottomWidth: 1, flexDirection: 'row', backgroundColor: '#FAFAFA', notes_notes: flex: 3, notes_text: fontSize: 18, notes_selected_date: flex: 1, alignItems: 'flex-end', flexDirection: 'column', small_text: fontSize: 15, big_text: fontSize: 50, fontWeight: 'bold', inline: flexDirection: 'rij',

Ten slotte voegen we de logboeken toe, die erg lijken op die in de vorige zelfstudie, dus ik laat het aan u over om erachter te komen hoe de lay-out is bereikt!

  Maak een nieuwe invoer Op donderdag 14 november   

Dit zijn de stijlen:

logs: flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', opvulling: 20, borderColor: '# F5F5F5', borderBottomWidth: 1, log_text: fontSize: 25, log_subtext:  fontSize: 18

Conclusie

Dat is het! In deze zelfstudie hebt u een agendapagina gemaakt. We hebben een mooie kalenderlay-out voor een app gemaakt en ik heb je laten zien hoe JavaScript-code kan worden gebruikt om een ​​aantal beperkingen van Flexbox te compenseren. 

Zoals u hebt gezien, hadden we een manier nodig om het aantal dagen op rij te beperken tot slechts zeven dagen. Flexbox heeft geen manier om dit op te geven, daarom hebben we JavaScript gebruikt om de oorspronkelijke reeks dagen zo te reconstrueren dat ze zijn onderverdeeld in groepen die elk zeven dagen bevatten. Vanaf daar was alles wat we moesten doen om elke groep in een Uitzicht en pas dan toe flexDirection: 'rij' om elk van hen in hun eigen rij weer te geven.

In een volgende zelfstudie leert u hoe u de lay-out gebruikt die gewoonlijk wordt gebruikt in galerijpagina's. Bekijk in de tussentijd enkele van onze andere zelfstudies over React Native en Flexbox.

  • Aan de slag met React Native

    Gebruikers van mobiele apps verwachten de prestaties en functies die alleen kunnen worden geleverd door native app-ontwikkeling. Maar native gaan betekent vaak dat je moet ...
    Markus Mühlberger
    Reageer Native
  • Aan de slag met natuurlijke indelingen van React

    In deze tutorial leer je hoe je React Native-apps kunt indelen en hoe je lay-outs kunt implementeren die vaak in apps worden gebruikt.
    Wern Ancheta
    Reageer Native
  • Bouw een sociale app met React Native

    React Native, gemaakt door Facebook, laat je native mobiele apps schrijven in modern JavaScript. React Native apps worden omgezet in specifieke native views ...
    Markus Mühlberger
    Reageer Native
  • Hoe een gestreepte navigatie te bouwen met Flexbox

    Wilt u uw flexbox-kennis verbeteren en tegelijkertijd leren hoe u eenvoudig een aantrekkelijke en unieke lay-out kunt bouwen? Zo ja, lees deze ...
    George Martsoukos
    Flexbox
  • Animate Your React Native App

    Animaties kunnen uw app tot leven brengen en uw gebruikersinterface intuïtiever maken. In deze tutorial leer je hoe je verschillende soorten animaties implementeert in ...
    Wern Ancheta
    Reageer Native
  • Een inleiding tot de CSS Flexbox-module

    CSS, ondanks zijn relatief lage ervaren skill-plafond, lijkt altijd een moordend element in zijn voordeel te hebben. Onthoud hoe mediaquery's responsief reageerden ...
    Umar Hansa
    HTML & CSS