Créer des applications mobiles avec React Native

Auteur: Mohamed CHINY Durée necessaire pour le cours de Créer des applications mobiles avec React Native Niveau recommandé pour le cours de Créer des applications mobiles avec React Native Supports vidéo non disponibles pour ce cours Exercices de renforcement non disponibles pour ce cours Quiz non disponibles pour ce cours

Page 9: Les composants de base (core components) en React Native

Toutes les pages

Les composant de base en React Native - Core components

Il existe une multitude de composants fondamentaux (core components) en React Native. La plupart d'entre eux sont toujours présents dans les applications mobiles et ils sont dotés de nombreux attributs qui permettent de personnaliser leur apparence et leur comportement. Si vous voulez tous les détails concernant les composants, je vous recommande vivement de consulter le support officiel de React Native à travers ce lien.

Composant View

Le composant View est un conteneur générique ou universelle. Il sert généralement à englober d'autres composants plus élémentaires comme les textes ou les images. On peut considérer le composant View comme la balise DIV du HTML qui sert généralement à spécifier des blocs où l'on intègre les éléments visibles de l'interface.

Nous avons déjà utilisé le composant View dans les exemples précédents et en guise de rappel son code ressemble à ceci:
<View>
   <Text>Bonjour</Text>
</View>
Dans ce cas, le composant View sert de conteneur principal qui renferme un texte inclus dans le composant Text.

Composant Text

Comme son nom l'indique, le composant Text sert à intégrer un texte. En effet, on ne peut pas inclure le texte n'importe où. A titre d'exemple, si on fait ceci:
<View>
   Bonjour
</View>
On aura l'erreur suivante:
ERROR: Text strings must be rendered within a <Text> component.
L'e message est clair, on ne peut pas intégrer un texte en dehors du composant Text. Donc, pour avoir le résultat attendu, on doit plutôt faire ceci:
<View>
   <Text>Bonjour</Text>
</View>

Composant Button

Le composat Button sert à intégrer un bouton simple à notre interface. Il s'agit d'un élément incontournable dans la plupart des applications car il permet de mener des actions comme la soumission d'un formulaire, la validation d'une action, la navigation entre les vues etc. Donc, on associe souvent un event handler au composant Button.

Le composant Button de React Native est simple et pratique, mais il présente plusieurs limites qui poussent souvent les développeurs à le remplacer par des alternatives comme TouchableOpacity ou Pressable.

Voici un exemple simple d'utilisation du composant Button:
<View style={styles.container}>
   <Button title="Continuer" onPress={handleButton} />
</View>
L'attribut title sert à définir le texte à afficher sur le bouton (l'étiquette du bouton) et onPress est l'événement déclenché quand on appuie sur le bouton et qui va exécuter la fonction handleButton (qu'on devrait définir au préalable).

Composant ScrollView

Le composant ScrollView sert à afficher le contenu défilant. En effet, ce composant permet de rendre scrollable une vue contenant plusieurs éléments, que ce soit verticalement ou horizontalement.

Exemple d'utilisation:
<View style={styles.container}>
   <ScrollView onScroll={handleScroll}>
      <Text>Texte 1</Text>
      <Text>Texte 2</Text>
      <Text>Texte 3</Text>
   </ScrollView>
</View>
Si les textes sont trop gros ou présentent des marges importantes, alors le composant ScrollView sera srcollable. C'est un peu similaire l'effet overflow que l'on appliquer en CSS sur des conteneurs HTML.

L'événement onScroll est déclenché si on défile sur la zone. On peut lui associer une fonction qui active une animation ou le lazy loading.

Il existe une multitude d'attributs que l'on peut associé à ce composant comme horizontal (booléen) qui active un scroll horizontal, showsHorizontalScrollIndicator et showsVerticalScrollIndicator (booléens) qui affichent respectivement la scrollbar (ou ascenseur) horizontale et verticale, ou encore pagingEnabled (booléen) qui active le scroll sur la page entière, c'est à dire que si on défile, le prochain bloc sera placé sur l'écran tout entière. Il s'agit d'un effet très prisé dans le cas des carrousels ou le système de pagination fluide.

Composant TextInput

Le composant TextInput permet de créer une zone de texte qui permet à l'utilisateur de saisir du texte (email, numéro de téléphone, expression de recherche, commentaire...). Il s'agit sans doute d'un composant essentiel que l'on trouve presque dans toutes les applications.

Exemple:
<View style={styles.container}>
   <TextInput placeholder="Téléphone" keyboardType="numeric" />
</View>
L'attribut placeholder (qui existe d'ailleurs en HTML) permet d'écrire un texte temporaire en attendant la saisie. Il sert souvent à décrire le rôle du champ ou le genre d'information attendu.

L'attribut keyboardType permet de changer le type du clavier affiché une fois le champs activé. Parmi les valeurs possible, il y a numeric, email-address et default.

Il existe plein d'autres attributs applicables à ce composant, le plus important est sans doute value qui sert à la fois à appliquer un texte par défaut et aussi à lire le texte saisi, l'attribut secureTextEntry (booléen) qui masque le texte saisi (comme un mot de passe) et l'attribut multiline (booléen) qui permet de spécifier si le champ accepte plusieurs lignes (comme une textarea de HTML) ou une seule ligne comme c'est le cas pour une zone de texte classique.

Composant Image

Comme son nom l'indique, le composant Image permet d’afficher une image dans une application mobile. L'image peut provenir d’un fichier local ou d’une URL distante.

Exemple qui intègre une image provenant d'une URL distante:
<View style={styles.container}>
   <Image
   source={{uri:"https://www.chiny.me/images/footerlogo.png"}}
   style={{width:200,height:160}}
   />
</View>
L'attribut source permet de spécifier le chemin vers l'image. Il s'agit d'un objet Javascript (que l'on doit intégrer en utilisant l'interpolation JSX). Si l'image provient d'une URL distante (serveur distant ou API), dans ce cas, on spécifie la clé uri dont la valeur et le chemin absolu qui mène à l'image.

Si on veut intégrer une image locale alors on aura un code qui ressemble à ceci:
<View style={styles.container}>
   <Image
   source={require("./assets/images/footerlogo.png")}
   style={{ width: 200, height: 160 }}
   />
</View>
Il est important de placer l'image dans un dossier accessible publiquement (par exemple ./assets/images).
On peut également appliquer du flou à l'image à l'aide de l'attribut blurRadius ou redimensionner l'image à l'aide de resizeMode.

Composant TouchableOpacity

Le composant TouchableOpacity rend son contenu cliquable avec un effet de transparence au toucher. Il est souvent utilisé pour créer des boutons personnalisés, des cartes interactives ou des éléments de navigation. En effet, le composant TouchableOpacity est préféré au composant Button en raison de la limitation des styles que l'on peut appliquer à ce dernier. En plus, le composant TouchableOpacity rend clicable tout type de contenu qu'il enveloppe (Texte, Image, View).

Un autre avantage que présente ce composant c'est son uniformité vis à vis d'Android et iOS, au moment où le composant Button pourrait avoir des formes différentes selon le système d'exploitation.

Concernant les événements, le composant Button supporte seulement onPress, alors que TouchableOpacity supporte d'autres événement comme onLongPress, onPressIn et onPressOut

En React Native, les événements onPressIn, onPressOut et onLongPress permettent de gérer différentes phases du toucher sur un composant interactif comme TouchableOpacity. L'évenement onPressIn se déclenche dès que l’utilisateur commence à appuyer, ce qui est idéal pour appliquer un effet visuel immédiat (comme un zoom ou une ombre). L'événement onPressOut intervient dès que l’utilisateur relâche le doigt, même s’il n’a pas validé l’action, ce qui permet de réinitialiser le style ou de déclencher une animation de sortie. Enfin, onLongPress s’active si l’utilisateur maintient l’appui suffisamment longtemps, et sert souvent à afficher un menu contextuel, une prévisualisation ou une action secondaire.

Exemple:
<View style={styles.container}>
   <TouchableOpacity
   activeOpacity={0.6}
   style={{backgroundColor:"#00AA00", padding:10}}>
      <Text style={{color:"white", textAlign:"center"}}>
         Valider
      </Text>
   </TouchableOpacity>
</View>
Dans cet exemple, le message inclus dans le composant Text est rendu cliquable vu qu'il est enveloppé par le composant TouchableOpacity. L'attribut activeOpacity définit le niveau de transparence appliqué au moment du toucher. Il permet de donner un feedback visuel immédiat à l’utilisateur lorsqu’il appuie sur un élément interactif.