Cloner Tinder à l'aide de React Native Elements et de Expo –
Il est difficile de disposer de dispositions de pixels parfaites sur un mobile. Même si React Native facilite la tâche par rapport à ses homologues natifs, il faut encore beaucoup de travail pour obtenir une application mobile à la perfection.
Dans ce tutoriel, nous allons cloner la plus célèbre application de rencontres, Tinder. Nous découvrirons ensuite un framework d'interface utilisateur appelé React Native Elements qui facilite le style des applications React Native.
Comme il ne s'agit que d'un didacticiel de mise en page, nous allons utiliser Expo, car cela rend les choses beaucoup plus faciles à mettre en place que le vieux un peu vieux [Native-Cli
. Nous utiliserons également beaucoup de données factices pour créer notre application
Nous créerons quatre écrans en tout … Accueil Coups de cœur Profil et Messages .
Voulez-vous apprendre Réagissez Autochtone de la base? Cet article est un extrait de notre bibliothèque Premium. Obtenez une collection complète de livres natifs de React couvrant les bases, les projets, les astuces, les outils, etc., avec SitePoint Premium. Inscrivez-vous maintenant pour seulement 9 $ / mois .
Prérequis
Pour ce tutoriel, vous devez posséder des connaissances de base de Réagir Native et avoir une connaissance suffisante de de Expo . . Vous aurez également besoin du client Expo installé sur votre appareil mobile ou d'un simulateur compatible installé sur votre ordinateur. Vous trouverez des instructions sur la procédure à suivre ici ici .
Vous devez également posséder une connaissance de base des styles de dans React Native. Les styles dans React Native sont fondamentalement une abstraction similaire à celle de CSS, avec seulement quelques différences. Vous pouvez obtenir une liste de toutes les propriétés dans la feuille de feuille de style .
Tout au long de ce didacticiel, nous utiliserons le fil
. Si vous n'avez pas le fil
déjà installé, installez-le à partir de ici .
Assurez-vous également que vous avez déjà installé expo-cli
sur votre ordinateur. .
S'il n'est pas déjà installé, installez-le:
$ yarn global add expo-cli
Pour vous assurer que nous sommes sur la même page, voici les versions utilisées dans ce tutoriel:
- Noeud 11.14.0
- npm 6.4.1
- fil 1.15.2
- expo 2.16. 1
Assurez-vous de mettre à jour expo-cli
si vous ne l'avez pas mise à jour depuis un moment, car les versions de expo
sont rapidement obsolètes.
Nous allons construisez quelque chose qui ressemble à ceci:
Si vous voulez simplement cloner le repo, le code complet se trouve sur GitHub .
Pour commencer
Mettons en place un nouveau projet d’exposition utilisant expo-cli
:
$ expo init expo-tinder
Il vous sera ensuite demandé de choisir un modèle. Vous devez choisir tabs
et appuyer sur . Entrez .
Ensuite, il vous sera demandé de nommer le projet. Tapez de l'expo
et tapez . Entrez à nouveau .
Enfin, il vous sera demandé de presser y pour installer des dépendances avec le fil
ou n pour installer des dépendances avec npm
. Appuyez sur et .
Cette application permet de créer une nouvelle application React Native utilisant expo-cli
.
Réagissez Native Elements
React Native Elements est une boîte à outils d'interface utilisateur multiplate-forme pour React Native avec une conception cohérente pour Android, iOS et le Web.
Il est facile à utiliser et entièrement construit avec JavaScript. C'est également le tout premier kit d'interface utilisateur conçu pour React Native.
Il nous permet de personnaliser entièrement les styles de chacun de nos composants, de manière à ce que chaque application ait son propre aspect et sa propre sensation.
open source et soutenu par une communauté de développeurs impressionnants .
Vous pouvez créer facilement de belles applications.
Cloning Tinder UI
We 'a déjà créé un projet nommé expo-tinder
.
Pour exécuter le projet, tapez ceci:
$ yarn start
Appuyez sur i pour exécuter le simulateur iOS. Ceci fera automatiquement fonctionner le simulateur iOS même s’il n’est pas ouvert.
Appuyez sur a pour exécuter l’émulateur Android. Notez que l'émulateur doit déjà être installé et démarré avant de taper a . Sinon, une erreur se produira dans le terminal.
Il devrait ressembler à ceci:
Navigation
La configuration initiale a déjà été installée react-navigation
pour nous. La navigation par les onglets du bas fonctionne également par défaut car nous avons choisi les onglets
dans la deuxième étape de expo init
. Vous pouvez le vérifier en appuyant sur Liens et Paramètres .
Le dossier écrans /
est responsable du contenu affiché lorsque les onglets sont modifiés.
] Maintenant, supprimez complètement le contenu de HomeScreen.js
et remplacez-le par le texte suivant:
import Réaction de 'react'
importer {Text, View} de 'react-native'
classe HomeScreen étend React.Component {
render () {
revenir (
Écran d'accueil
)
}
}
export par défaut HomeScreen
Vous devriez voir la nouvelle interface maintenant:
Nous allons maintenant adapter les onglets à l’application que nous allons créer. Pour notre clone Tinder, nous allons avoir quatre écrans: Accueil Coups de cœur Profil et Messages . [19659003] Nous pouvons supprimer complètement LinksScreen.js
et SettingsScreen.js
du dossier screens /
. Notez que notre application se casse, avec un écran rouge plein d’erreurs.
En effet, nous y sommes liés dans le dossier de navigation /
. Ouvrez MainTabNavigator.js
dans le dossier de navigation /
. Il ressemble actuellement à ceci:
import Réagissez à partir de 'réagit';
importer {Platform} de 'react-native';
import {createStackNavigator, createBottomTabNavigator} de 'react-navigation';
importer TabBarIcon de '../components/TabBarIcon';
importer HomeScreen de '../screens/HomeScreen';
importer LinksScreen de '../screens/LinksScreen';
importer SettingsScreen de '../screens/SettingsScreen';
const HomeStack = createStackNavigator ({
Accueil: HomeScreen,
});
HomeStack.navigationOptions = {
tabBarLabel: 'Home',
tabBarIcon: ({focus}) => (
),
};
const LinksStack = createStackNavigator ({
Liens: LinksScreen,
});
LinksStack.navigationOptions = {
tabBarLabel: 'Liens',
tabBarIcon: ({focus}) => (
),
};
const SettingsStack = createStackNavigator ({
Paramètres: Paramètres Écran,
});
SettingsStack.navigationOptions = {
tabBarLabel: 'Paramètres',
tabBarIcon: ({focus}) => (
),
};
export par défaut createBottomTabNavigator ({
HomeStack,
LinksStack,
ParamètresStack,
});
Supprimer complètement les références à LinksStack
et SettingsStack
car nous n’avons pas besoin de ces écrans dans notre application. Cela devrait ressembler à ceci:
import Réagissez à partir de 'réagit'
importer {Platform} de 'react-native'
importer {
createBottomTabNavigator,
createStackNavigator,
} de 'réagir-navigation'
importer TabBarIcon de '../components/TabBarIcon'
importer HomeScreen de '../screens/HomeScreen'
const HomeStack = createStackNavigator ({
Accueil: HomeScreen,
})
HomeStack.navigationOptions = {
tabBarLabel: 'Home',
tabBarIcon: ({focus}) => (
),
}
export par défaut createBottomTabNavigator ({
HomeStack,
})
Allez-y et créez TopPicksScreen.js
ProfileScreen.js
et MessagesScreen.js
dans le dossier d'écrans /
.
. ] Ajoutez ce qui suit dans TopPicksScreen.js
:
import Réagissez à partir de 'réagir'
importer {Text, View} de 'react-native'
La classe TopPicksScreen étend React.Component {
render () {
revenir (
Écran Meilleurs choix
)
}
}
exporter par défaut TopPicksScreen
Ajouter ce qui suit dans ProfileScreen.js
:
import Réagissez à partir de 'réagir'
importer {Text, View} de 'react-native'
la classe ProfileScreen étend React.Component {
render () {
revenir (
Écran de profil
)
}
}
exporter ProfileScreen par défaut
Ajouter ce qui suit dans MessagesScreen.js
:
import Réagissez à partir de 'réagir'
importer {Text, View} de 'react-native'
La classe MessagesScreen étend React.Component {
render () {
revenir (
Écran Messages
)
}
}
exporter par défaut MessagesScreen
Continuons et changeons de composants / TabBarIcon.js
car nous aurons besoin d’icônes personnalisées dans la navigation de l’onglet inférieur. Il ressemble actuellement à ceci:
import Réagissez à partir de 'réagit';
importer {Icon} de 'expo';
importer des couleurs à partir de '../constants/Colors';
La classe d'exportation TabBarIcon par défaut s'étend à React.Component {
render () {
revenir (
)
}
}
La seule chose que nous faisons ici est d’ajouter un accessoire Icon
afin d’avoir différents types de Icon
au lieu de seulement Ionicons
. Actuellement, les différents types pris en charge sont AntDesign
Entypo
EvilIcons
Feather
FontAwesome
. FontAwesome5
FontAwesome5Brands
Fondation
Ionicons MatérielCommunauté
Octicons
et Zocial
.
Vous pouvez choisir différentes icônes dans le répertoire @ expo / vector-icons . Il ajoute une couche de compatibilité autour de @ oblador / react-native-vector-icons pour fonctionner avec le système d'actifs de l'Expo.
TabBarIcon.js
devrait maintenant ressembler à ceci:
] import Réagir de 'réagir'
importer des couleurs depuis '../constants/Colors'
La classe d'exportation TabBarIcon par défaut s'étend à React.Component {
render () {
const {Icône, nom, ciblé} = this.props
revenir (
)
}
}
Nous pouvons maintenant passer le composant Icon
au composant TabBarIcon
ci-dessus pour charger différentes icônes.
Nous devons modifier la mise en œuvre de HomeStack
dans. le dossier MainTabNavigator.js
à incorporer dans le nouveau élément TabBarIcon
du composant du
composant
modifié:
import {Icon} de 'expo'
const HomeStack = createStackNavigator ({
Accueil: HomeScreen,
})
HomeStack.navigationOptions = {
tabBarLabel: 'Home',
tabBarIcon: ({focus}) => (
),
}
Le seul changement ici est l'ajout de Icon = {Icon.MaterialCommunityIcons}
car nous avons modifié l'implémentation de TabBarIcon
pour accepter le code source afin de pouvoir utiliser différents types de icônes de différents fournisseurs.
Maintenant, ces icônes doivent être chargées en premier. Sinon, nous verrons un écran vide avant que les icônes ne s'affichent. Pour cela, nous devons changer App.js
en ajoutant ce qui suit:
Font.loadAsync ({
// Ceci est la police que nous utilisons pour notre barre d'onglets
... Icon.MaterialIcons.font,
... Icon.MaterialCommunityIcons.font,
... Icon.FontAwesome.font,
... Icon.Feather.font,
}),
Ces types de police sont utilisés à certains moments dans notre application. C’est pourquoi nous n’avons inclus que quatre polices. Par exemple, MaterialCommunityIcons
est utilisé dans la variable HomeStack
dans le MainTabNavigator.js
comme indiqué ci-dessus.
Nous allons également masquer notre StatusBar
dans App.js
avec ceci:
Nous remplacerons également les actifs utilisés dans App.js
:
Asset.loadAsync ([
require('./assets/images/splash.png'),
require('./assets/images/icon.png'),
]),
Le fichier App.js
devrait maintenant ressembler à ceci:
import {AppLoading, Asset, Font, Icon} de 'expo'
importer Réagir de 'réagir'
importer {StatusBar, StyleSheet, View} de 'react-native'
importer AppNavigator à partir de './navigation/AppNavigator'
exporter la classe par défaut App étend React.Component {
state = {
isLoadingComplete: false,
}
render () {
if (! this.state.isLoadingComplete &&! this.props.skipLoadingScreen) {
revenir (
)
} autre {
revenir (
}
}
_loadResourcesAsync = async () => {
retour Promise.all ([
Asset.loadAsync([
require('./assets/images/splash.png'),
require('./assets/images/icon.png'),
]),
Font.loadAsync ({
// Ceci est la police que nous utilisons pour notre barre d'onglets
... Icon.MaterialIcons.font,
... Icon.MaterialCommunityIcons.font,
... Icon.FontAwesome.font,
... Icon.Feather.font,
}),
])
}
_handleLoadingError = error => {
// Dans ce cas, vous pouvez signaler l'erreur à votre erreur.
// service de génération de rapports, tel que Sentry
console.warn (erreur)
}
_handleFinishLoading = () => {
this.setState ({isLoadingComplete: true})
}
}
const styles = StyleSheet.create ({
récipient: {
flex: 1,
backgroundColor: '#fff',
},
})
Nous devons également relier tous les écrans ci-dessus - TopPicksScreen.js
ProfileScreen.js
et MessagesScreen.js
—inférieur écrans /
in MainTabNavigator.js
dans le dossier navigation /
comme indiqué dans l'organigramme suivant:
affiché dans l'organigramme suivant:
Ajoutez également le code suivant: dans MainTabNavigator.js
:
importez MessagesScreen de '../screens/MessagesScreen'
importer ProfileScreen de '../screens/ProfileScreen'
importer TopPicksScreen de '../screens/TopPicksScreen'
const TopPicksStack = createStackNavigator ({
TopPicks: TopPicksScreen,
})
TopPicksStack.navigationOptions = {
tabBarLabel: 'TopPicks',
tabBarIcon: ({focus}) => (
),
}
const MessagesStack = createStackNavigator ({
Messages: MessagesScreen,
})
MessagesStack.navigationOptions = {
tabBarLabel: 'Messages',
tabBarIcon: ({focus}) => (
),
}
const ProfileStack = createStackNavigator ({
Profil: ProfileScreen,
})
ProfileStack.navigationOptions = {
tabBarLabel: 'Profil',
tabBarIcon: ({focus}) => (
),
}
Le code ci-dessus crée trois navigateurs de pile - TopPicksStack
MessagesStack
et ProfileStack
. La propriété statique navigationOptions
nous permet d'ajouter notre propre étiquette et notre icône à l'onglet inférieur.
De plus, changez createBottomTabNavigator
pour vous assurer de TopPicksStack
. MessagesStack et ProfileStack
apparaissent dans l'onglet de navigation inférieur:
export par défaut createBottomTabNavigator ({
HomeStack,
TopPicksStack,
MessagesStack,
ProfileStack,
})
Maintenant, vous devriez pouvoir voir différentes icônes dans la navigation de l'onglet inférieur avec différents écrans, comme suit:
Nous devons maintenant supprimer le en-tête qui apparaît sur chaque écran, occupant un espace supérieur. Pour s'en débarrasser, nous devons ajouter headerMode: 'none'
dans la createStackNavigator
de la configuration
à ajouter dans HomeStack
TopPicksStack
MessagesStack
et ProfileStack
.
HomeStack
devrait ressembler à ceci:
.
{
Accueil: HomeScreen,
},
{
headerMode: 'aucun',
},
)
Faites de même pour le reste d'entre eux. Maintenant, si vous vérifiez, le texte monte en haut à gauche, juste au-dessus de l’horloge.
Il existe une solution simple à cela. Nous devons utiliser SafeAreaView
. SafeAreaView
restitue le contenu dans les limites de la zone de sécurité d'un périphérique. Lançons dans le répertoire écrans /
et changez HomeScreen.js
pour utiliser SafeAreaView
de sorte qu’il ressemble à ceci:
import Réagissez à partir de "réagissez"
importer {SafeAreaView, Text} de 'react-native'
classe HomeScreen étend React.Component {
render () {
revenir (
Écran d'accueil
)
}
}
export par défaut HomeScreen
Il restitue maintenant le contenu à l'intérieur des limites de l'appareil.
Allez-y et changez le reste pour qu'il en fasse de même.
C'est répétitif pour encapsuler SafeAreaView
dans chaque composant au lieu de le configurer sur un composant racine tel que App.js
. Mais sachez que cela ne fonctionnera pas si vous essayez de le faire sur App.js
.
N'oubliez pas que SafeAreaView
doit toujours être configuré sur les composants d'écran ou leur contenu. , et ne pas envelopper des navigateurs entiers. Vous pouvez en savoir plus sur cet article de blog .
Écrans
Maintenant que notre navigation est prise en charge, nous pouvons commencer à travailler sur la présentation.
Nous allons être en utilisant un kit d’interface utilisateur appelé React Native Elements, alors installez-le:
$ yarn add rea-native-elements
Avant de commencer, assurez-vous de copier le répertoire assets /
du GitHub repo entièrement pour les images factices.
Nous allons maintenant commencer à travailler sur l'écran d'accueil.
Écran d'accueil
Avant de commencer à travailler sur HomeScreen.js
supprimons les fichiers inutiles. Allez dans le dossier components /
et supprimez le StyledText.js
et le __ tests __
.
Commençons par travailler sur notre écran d'accueil.
Tout d'abord. , créez Card.js
dans le dossier composants /
. Nous allons afficher une carte de profil avec le nom de la personne, son âge et sa distance.
Nous allons utiliser un composant Tile de react-native-elements
pour afficher notre carte d'utilisateur.
Le composant Tile
de react-native-elements
ressemble à ceci:
import Réagissez à partir de 'réagir'
importer {Platform, StyleSheet} de 'react-native'
importer {Tile} de 'react-native-elements'
importer une mise en page à partir de '../constants/Layout'
const BOTTOM_BAR_HEIGHT =! Platform.isPad? 29: 49 // trouvé à partir de https://stackoverflow.com/a/50318831/6141587
export const Carte = ({image, titre, légende}) => (
)
const styles = StyleSheet.create ({
récipient: {
flex: 1,
alignItems: 'center',
},
imageContainer: {
width: Layout.window.width - 30,
height: Layout.window.height - BOTTOM_BAR_HEIGHT * 6,
borderRadius: 20,
débordement: 'hidden', // cela fait de la magie
},
Titre: {
position: 'absolu',
à gauche: 10
en bas: 30
},
légende: {
position: 'absolu',
à gauche: 10
en bas: 10
},
})
Le composant Card
prend la pic
titre
et légende
qui sont à leur tour transmis au carreau . Composant de
.
Le composant Tile
a quelques propriétés supplémentaires. activeOpacity
est un nombre passé pour contrôler l'opacité lorsque vous appuyez sur la mosaïque. Cette valeur est facultative, mais la valeur par défaut est 0,2, ce qui la rend transparente sur la presse. Nous passons donc une valeur proche de 1 pour qu'elle reste opaque. . L'appui présenté
change l'apparence de Tile
. Il conserve le texte dans le titre
et une légende du
accessoire sur l'image plutôt qu'en dessous lorsque présenté
n'est pas spécifié ou est défini sur false
. .
Les autres sont des styles appliqués pour obtenir une carte d'utilisateur correcte. Le style conteneur
centre la carte utilisateur. imageContainer
a une largeur et une hauteur. La largeur
est définie sur la largeur totale du périphérique - 30dp (pixels du périphérique) - et la hauteur est
définie sur la hauteur totale du périphérique - BOTTOM_BAR_HEIGHT * 6
.
Nous obtenons le BOTTOM_BAR_HEIGHT
du stackoverflow.com .
Nous obtenons la largeur du périphérique à partir du fichier constants / Layout.js
qui contient essentiellement les éléments suivants:
import {Dimensions} de 'react-native'
const width = Dimensions.get ('window'). width
const height = Dimensions.get ('window'). height
défaut d'exportation {
fenêtre: {
largeur,
la taille,
},
isSmallDevice: width <375,
}
Ensuite, nous ajoutons un rayon de bordure à l'image. Mais le rayon de la frontière ne sera pas appliqué. Nous avons également besoin de overflow: hidden
pour que cela fonctionne.
Ensuite, nous positionnons nos titres
et de position
à utiliser et [faites-lesapparaîtredanslecoininférieurgauchejusteau-dessusdel'image
Créez ensuite un fichier utils / shuffleArray.js
et collez-y le fichier suivant:
// trouvé à l'adresse https: //stackoverflow.com/a/46545530/6141587
const shuffleArray = array =>
tableau
.map (a => ({sort: Math.random (), valeur: a}))
.sort ((a, b) => a.sort - b.sort)
.map (a => a.value)
exportation par défaut shuffleArray
Ceci s'assure que notre tableau est randomisé à chaque fois.
Créez maintenant un fichier constantes / Pics.js
et collez-le comme suit:
import shuffleArray à partir de '../utils/shuffleArray '
export const HomeScreenPics = shuffleArray ([
{
pic: require('../assets/images/women/women1.jpg'),
title: 'Amelia, 27',
caption: '16 miles away',
},
{
pic: require('../assets/images/women/women2.jpg'),
title: 'Joanna, 19',
caption: '2 miles away',
},
{
pic: require('../assets/images/women/women3.jpg'),
title: 'Charlie, 32',
caption: '24 miles away',
},
{
pic: require('../assets/images/women/women4.jpg'),
title: 'Mary, 23',
caption: '45 miles away',
},
{
pic: require('../assets/images/women/women5.jpg'),
title: 'Lucy, 27',
caption: '32 miles away',
},
{
pic: require('../assets/images/women/women6.jpg'),
title: 'Rachel, 29',
caption: '30 miles away',
},
{
pic: require('../assets/images/women/women7.jpg'),
title: 'Ava, 31',
caption: '14 miles away',
},
{
pic: require('../assets/images/women/women8.jpg'),
title: 'Monica, 35',
caption: '19 miles away',
},
{
pic: require('../assets/images/women/women9.jpg'),
title: 'Lisa, 25',
caption: '7 miles away',
},
{
pic: require('../assets/images/women/women10.jpg'),
title: 'Julia, 22',
caption: '9 miles away',
},
{
pic: require('../assets/images/men/men1.jpg'),
title: 'Aaron, 24',
caption: '3 miles away',
},
{
pic: require('../assets/images/men/men2.jpg'),
title: 'Novak, 27',
caption: '12 miles away',
},
{
pic: require('../assets/images/men/men3.jpg'),
title: 'Justin, 32',
caption: '20 miles away',
},
{
pic: require('../assets/images/men/men4.jpg'),
title: 'Tony, 21',
caption: '4 miles away',
},
{
pic: require('../assets/images/men/men5.jpg'),
title: 'Leo, 30',
caption: '22 miles away',
},
{
pic: require('../assets/images/men/men6.jpg'),
title: 'Ronald, 39',
caption: '35 miles away',
},
{
pic: require('../assets/images/men/men7.jpg'),
title: 'Johnny, 41',
caption: '44 miles away',
},
{
pic: require('../assets/images/men/men8.jpg'),
title: 'Chandler, 35',
caption: '29 miles away',
},
{
pic: require('../assets/images/men/men9.jpg'),
title: 'Joey, 29',
caption: '17 miles away',
},
{
pic: require('../assets/images/men/men10.jpg'),
title: 'Alfie, 37',
caption: '27 miles away',
},
])
Il contient toutes les images nécessaires à notre application. Remarquez chaque fois que nous appelons shuffleArray
pour randomiser notre tableau.
Laissons l’installation réagir pour que nos cartes soient balayées comme Tinder. La dernière version (v1.6.7 au moment de la rédaction) utilise réagit-native-view-overflow qui ne prend pas en charge Expo. Nous allons donc installer la v1.5.25:
$ yarn add react-native-deck-swiper@1.5.25
Maintenant, allez dans le fichier HomeScreen.js
et collez ce qui suit:
import Réagissez à partir de 'react'
importer {SafeAreaView, StyleSheet} de 'react-native'
importer Swiper de 'react-native-deck-swiper'
importer {Carte} de '../components/Card'
importer {HomeScreenPics} de '../constants/Pics'
classe HomeScreen étend React.Component {
render () {
revenir (
)
}
}
const styles = StyleSheet.create ({
récipient: {
flex: 1,
backgroundColor: 'transparent',
},
})
export par défaut HomeScreen
Maintenant, nos cartes sont échangeables, et notre écran d'accueil ressemble à ceci:
Essayez de glisser à présent, et cela devrait fonctionner comme suit:
Si vous le souhaitez Pour savoir comment créer ce genre d'animations Tinder Swipe, vous devriez jeter un coup d'œil à la série Tinders Swipe de Varun Nath sur YouTube.
Maintenant que notre écran d'accueil est terminé, construisons l’écran Top Picks.
Écran Top Picks
À présent, concevons l’écran Top Picks.
Commençons par constants / Pics.js
et ajoutons le bit suivant à la fin: [19659051] export const TopPicksScreenPics = shuffleArray ([
{
pic: require('../assets/images/women/women11.jpg'),
title: 'Annie, 40',
caption: '26h left',
},
{
pic: require('../assets/images/women/women12.jpg'),
title: 'Lena, 31',
caption: '20h left',
},
{
pic: require('../assets/images/women/women13.jpg'),
title: 'Kendra, 19',
caption: '15h left',
},
{
pic: require('../assets/images/women/women14.jpg'),
title: 'Mia, 23',
caption: '45h left',
},
{
pic: require('../assets/images/women/women15.jpg'),
title: 'Jenny, 27',
caption: '12h left',
},
{
pic: require('../assets/images/men/men11.jpg'),
title: 'Dwayne, 34',
caption: '13h left',
},
{
pic: require('../assets/images/men/men12.jpg'),
title: 'Novak, 27',
caption: '22h left',
},
{
pic: require('../assets/images/men/men13.jpg'),
title: 'Zikomo, 32',
caption: '20h left',
},
{
pic: require('../assets/images/men/men14.jpg'),
title: 'Sam, 19',
caption: '42h left',
},
{
pic: require('../assets/images/men/men15.jpg'),
title: 'Richard, 31',
caption: '21h left',
},
])
Voici les images dont nous aurons besoin dans l’écran Choix principaux.
Maintenant, ajoutez le code suivant dans TopPicksScreen.js
:
import Réagissez à partir de 'react'
importer {ScrollView, StyleSheet, View} de 'react-native'
importer {Text, Tile} de 'react-native-elements'
importer {SafeAreaView} de 'react-navigation'
importer {TopPicksScreenPics} de '../constants/Pics'
La classe TopPicksScreen étend React.Component {
render () {
revenir (
Meilleurs choix
Profils en vedette du jour, choisis juste pour vous
{TopPicksScreenPics.map (({image, titre, légende}, i) => (
))}
)
}
}
const styles = StyleSheet.create ({
h2Style: {
fontWeight: 'gras',
textAlign: 'center',
couleur: '# 000000',
},
h4Style: {
textAlign: 'center',
couleur: '# 757575',
},
la grille: {
marginTop: 20,
marginBottom: 20,
},
Titre: {
position: 'absolu',
à gauche: 10
en bas: 50
backgroundColor: 'noir',
marginBottom: -2,
rembourrage: 10
},
légende: {
position: 'absolu',
à gauche: 10
en bas: 0,
backgroundColor: 'noir',
marginTop: 10,
rembourrage: 10
},
})
exporter par défaut TopPicksScreen
Dans un premier temps, nous utilisons le composant de base Text
trouvé dans avec éléments et sous-titres.
Nous parcourons ensuite toutes les images ajoutées. dans constantes / Pics.js
et affichez-les à l'aide des composants Tile
.
Le titre est placé dans
. ] center
par défaut, mais nous les avons déplacés vers le bas à gauche avec la position : 'absolute'
.
Ceci conclut notre écran Top Picks, qui était très simple.
Il ressemble à ceci:
Écran Messages
Commençons par l’écran Messages. Premièrement, nous avons besoin de données factices à afficher sur les listicles.
Créez Messages.js
dans le dossier constantes /
et collez-le comme suit:
import shuffleArray from ' ../utils/shuffleArray '
export const Messages = shuffleArray ([
{
pic: require('../assets/images/women/women1.jpg'),
title: 'Amelia, 27',
message: "Let's get to your favorite restaurant.",
},
{
pic: require('../assets/images/women/women2.jpg'),
title: 'Joanna, 19',
message: "What's the best way to win you over?",
},
{
pic: require('../assets/images/men/men2.jpg'),
title: 'Novak, 27',
message: 'Will catch up with you later.',
},
{
pic: require('../assets/images/men/men3.jpg'),
title: 'Justin, 32',
message: 'Probably not going to work out :(',
},
{
pic: require('../assets/images/women/women3.jpg'),
title: 'Charlie, 32',
message: 'How about we go for a coffee on Sunday?',
},
{
pic: require('../assets/images/women/women5.jpg'),
title: 'Lucy, 27',
message: 'Sleeping for now.',
},
{
pic: require('../assets/images/men/men1.jpg'),
title: 'Aaron, 24',
message: 'See you soon.',
},
{
pic: require('../assets/images/men/men4.jpg'),
title: 'Tony, 21',
message: 'Seriously, come on time.',
},
{
pic: require('../assets/images/men/men5.jpg'),
title: 'Leo, 30',
message: "What'd you like?",
},
{
pic: require('../assets/images/women/women4.jpg'),
title: 'Mary, 23',
message: "Hey, what's up?",
},
{
pic: require('../assets/images/women/women14.jpg'),
title: 'Michelle, 45',
message: 'Howdy!!!',
},
{
pic: require('../assets/images/women/women12.jpg'),
title: 'Arya, 18',
message: 'Not today!',
},
])
Ensuite, créez MessagesScreen.js
dans le dossier composants /
et collez-le comme suit:
import Réagissez à partir de 'react'
importer {SafeAreaView, ScrollView, StyleSheet} à partir de 'react-native'
importer {ListItem} de 'react-native-elements'
importer {Messages} de '../constants/Messages'
La classe MessagesScreen étend React.Component {
render () {
revenir (
{Messages.map ((user, i) => (
))}
)
}
}
const styles = StyleSheet.create ({
Titre: {
fontSize: 24,
couleur: '# 3F3F3F',
},
Sous-titre: {
couleur: '# A5A5A5',
},
})
exporter par défaut MessagesScreen
Nous prenons les données factices Messages
nous les cartographions et les plaçons dans un ListItem
exporté à partir de react-native-elements
. Le composant ListItem
affiche une liste d'éléments l'un après l'autre, comme nous le voyons sur toutes les applications de messagerie, avec un grand avatar, le nom de l'utilisateur et le message. react-native-elements
simplifie l'écriture de notre propre liste de messages afin que nous puissions utiliser cinq lignes de code pour en faire une belle liste.
Il ressemble actuellement à ceci: [19659003]
Écran du profil
Créez l'écran final du profil
Créez d'abord un fichier utils / randomNo.js
et collez-le comme suit:
export const randomNo = (min, max) =>
Math.floor (Math.random () * (max - min) + min)
La fonction randomNo
renvoie un nombre aléatoire compris entre min
et max
.
Ouvrez maintenant composants / ProfileScreen.js
et collez ce qui suit:
import Réagissez à partir de 'réagir'
importer {Image, SafeAreaView, StyleSheet, View} à partir de 'react-native'
importer {Séparateur, Icône, Texte} à partir de 'réagir-éléments-natifs'
importer une mise en page à partir de '../constants/Layout'
importer {HomeScreenPics} de '../constants/Pics'
import {randomNo} de '../utils/randomNo'
const {pic, title} = AccueilScreenPics [randomNo(1, HomeScreenPics.length)]
const Social = ({name}) => (
)
la classe ProfileScreen étend React.Component {
render () {
revenir (
{titre}
Styliste chez Amelia & Co.
J'aime voyager. J'ai un chat nommé cornichons. S'il t'aime bien, je
sera probablement aussi.
Retrouvez-moi sur Social ici
)
}
}
const styles = StyleSheet.create ({
récipient: {
flex: 1,
alignItems: 'center',
},
imageContainer: {
marge: 20,
},
image: {
width: Layout.window.width - 60, // largeur du périphérique - quelques marges
height: Layout.window.height / 2 - 60, // hauteur du périphérique / 2 - une marge
borderRadius: 20,
},
Nom: {
couleur: '# 5E5E5E',
alignSelf: 'flex-start',
margeLeft: 30,
},
desc: {
couleur: '# 5E5E5E',
alignSelf: 'flex-start',
marginTop: 5,
marginHorizontal: 30,
fontSize: 14,
},
diviseur: {
backgroundColor: '# C0C0C0',
width: Layout.window.width - 60,
marge: 20,
},
Liens sociaux: {
flex: 1,
alignItems: 'flex-start',
flexDirection: 'rangée',
width: Layout.window.width,
margeLeft: 40,
},
iconContainer: {
paddingHorizontal: 8,
paddingVertical: 15,
},
})
exporter ProfileScreen par défaut
Décryptons un peu le code.
Tout d'abord, nous obtenons un tableau aléatoire pic
et du tableau
HomeScreenPics
qui n'est pas le premier. image mais peut être n'importe quel reste des images de ce tableau.
Ensuite, nous avons créé un composant Social
ressemblant à ceci:
const Social = ({name}) => (
)
Cela prend un nom
comme accessoire. Nous l'utilisons dans notre méthode render
. La méthode render
contient le composant SafeAreaView
habituel
View
et notre composant personnalisé Social
- avec un un peu de style que nous avons déjà vu plus haut.
Le seul composant unique ici est un composant Divider . Les séparateurs sont des séparateurs visuels de contenu. Nous les utilisons pour distinguer différentes sections de contenu.
Enfin, nous ajoutons du style.
Cela ressemble actuellement à ceci:
J’ai également fait un repo, au cas où vous voudriez le cloner. Vous pouvez le trouver ici sur GitHub.
Conclusion
Nous avons réussi à cloner une interface utilisateur Tinder avec un style personnalisé et l'aide importante de React Native Elements.
React Native Elements élimine tous les problèmes liés à la création d'une belle interface utilisateur en utilisant sa bibliothèque de composants prédéfinis.
Nous pourrions également tout créer à partir de rien, sans utiliser aucune bibliothèque d'interface utilisateur, mais cela nous obligerait à écrire beaucoup de code. - surtout le style. En utilisant une bibliothèque d'interface utilisateur, nous pouvons écrire moins de code et livrer notre application plus rapidement.
Vous pouvez maintenant imiter n'importe quelle interface utilisateur en prenant la plus petite partie de l'interface utilisateur et en la construisant. Utilisez des frameworks d'interface utilisateur pour écrire moins de code et expédier plus rapidement.
Source link