Le composant View dans React Native est l'élément de base de l'interface utilisateur, un analogue de l'élément div HTML pour les plateformes mobiles. View prend en charge l'imbrication à n'importe quelle profondeur, gère la disposition des éléments enfants via Flexbox et traite les événements tactiles. Selon React Native Docs, 2024, View est le composant le plus utilisé dans les applications — pratiquement chaque écran est construit à partir de conteneurs View imbriqués. Le composant se rend dans UIView natif sur iOS et android.view.View sur Android, garantissant des performances et une accessibilité natives.
Points clés
View est un composant fondamental de React Native qui sert de conteneur pour d'autres composants. Il prend en charge le style via StyleSheet, la mise en page via Flexbox, la gestion tactile, les animations et les transformations. View est une abstraction sur les éléments conteneurs natifs : UIView sur iOS et android.view.View sur Android.
Dans React Native, il n'est pas possible d'utiliser des éléments HTML — à la place, toutes les mises en page sont construites à partir de View. Même Text et Image sont généralement enveloppés dans View pour le positionnement. Le composant peut être vide (juste un conteneur) ou contenir n'importe quel nombre d'éléments enfants à n'importe quelle profondeur d'imbrication.
View prend en charge le rendu sur les deux plateformes à partir d'une seule base de code JavaScript. Les propriétés Flexbox, les marges, l'arrière-plan, les ombres et les bordures fonctionnent à l'identique sur iOS et Android. Les différences entre plateformes sont minimes — par exemple, les ombres sur iOS utilisent shadowColor/shadowOffset, tandis que sur Android elles utilisent elevation.
Selon React Native Layout Docs, 2024, View est optimisé pour les appareils mobiles : il ne crée pas de vues natives supplémentaires lors de l'optimisation flatten et gère correctement les mises à jour en cascade lorsque les styles du parent changent.
Le composant View dispose d'un ensemble riche de props pour contrôler l'apparence, la mise en page et l'interactivité. Toutes les props se répartissent en plusieurs catégories : props de style, événements tactiles, accessibilité et fonctionnalités spécifiques à la plateforme. Explorons les groupes clés.
View prend en charge toutes les propriétés CSS standard pour les plateformes mobiles. Les principales incluent : flexDirection, justifyContent, alignItems pour le positionnement ; margin, padding pour l'espacement ; backgroundColor, borderRadius pour l'apparence ; width, height, maxHeight pour le dimensionnement.
View peut gérer les événements tactiles via les props onStartShouldSetResponder, onMoveShouldSetResponder et onResponderGrant. Ces événements permettent d'implémenter des gestes personnalisés sans bibliothèques. Pour les tap standard, onTouchStart, onTouchEnd et onPress (via Pressable ou TouchableOpacity) sont utilisés.
Sur iOS, shadowColor, shadowOffset, shadowOpacity, shadowRadius sont disponibles pour les ombres. Sur Android, ces propriétés sont ignorées — à la place, elevation est utilisée (une ombre de type carte). Le callback onLayout est déclenché lorsque les dimensions de View changent, ce qui est utile pour les mises en page adaptatives.
Flexbox est le seul mécanisme de mise en page dans React Native (contrairement au web, où Grid et Float sont disponibles). Tout le positionnement des éléments se fait via les propriétés Flexbox du composant View. Par défaut, View a flexDirection défini sur column, pas sur row comme sur le web, ce qui correspond à l'orientation verticale des écrans mobiles.
flexDirection détermine la direction de l'axe principal : column (par défaut) ou row. justifyContent contrôle la distribution le long de l'axe principal (flex-start, center, space-between). alignItems — le long de l'axe transversal (stretch — valeur par défaut). flex spécifie la proportion d'espace disponible pour un élément enfant.
import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
const CardLayout = () => (
<View style={styles.card}>
<View style={styles.row}>
<View style={styles.avatar} />
<View style={styles.content}>
<Text style={styles.name}>John Doe</Text>
<Text style={styles.role}>Developer</Text>
</View>
</View>
</View>
);
L'exemple montre une structure typique : un View externe — carte, une row interne — une ligne avec un avatar et un bloc de texte, content — une colonne avec nom et rôle. Cette structure View imbriquée est la norme pour tout écran React Native.
Bien que View soit conceptuellement similaire au div HTML, il existe des différences clés qu'il est important de comprendre lors du portage de code du web vers React Native. Ces différences concernent le rendu, les styles et le comportement par défaut.
| Caractéristique | View (React Native) | div (HTML) |
|---|---|---|
| flexDirection par défaut | column | row (dans le contexte block) |
| width/height | Par défaut 100% du parent | auto basé sur le contenu |
| Défilement | Non supporté (ScrollView requis) | overflow: auto/scroll |
| Ombres | iOS : shadow*, Android : elevation | box-shadow |
| Gestion des événements | Système Responder | Événements DOM |
| Rendu natif | UIView / android.view.View | Élément DOM |
La différence la plus importante est flexDirection: column par défaut. Cela signifie que sans configuration explicite, les éléments enfants sont disposés verticalement, pas horizontalement. La deuxième différence : la largeur et la hauteur de View par défaut s'étendent pour remplir tout l'espace disponible du parent (analogue à width: 100% en CSS).
Examinons deux exemples concrets d'utilisation de View dans des applications React Native : centrer le contenu sur tout l'écran et créer une grille de cartes responsive. Les deux motifs apparaissent dans chaque projet.
Pour créer un état vide, on utilise un View avec flex: 1 et un centrage sur les deux axes. C'est un motif standard pour les écrans de chargement, les états d'erreur et les listes vides.
const EmptyState = ({ message }) => (
<View style={styles.container}>
<Text style={styles.icon}>{icon}</Text>
<Text style={styles.message}>{message}</Text>
</View>
);
const styles = StyleSheet.create({
container: { flex: 1, justifyContent: 'center', alignItems: 'center' },
icon: { fontSize: 48 },
message: { fontSize: 16, color: '#666', marginTop: 16 },
});
La combinaison de justifyContent: center et alignItems: center dans un View avec flex: 1 centre le contenu sur les deux axes sur tout l'écran. C'est le motif le plus courant d'utilisation de View dans React Native.
Pour afficher deux colonnes de produits ou d'articles, on utilise un View avec flexDirection: row, flexWrap: wrap et des Views enfants avec une largeur fixe. Ce motif remplace CSS Grid dans React Native.
const ProductGrid = ({ products }) => (
<View style={styles.grid}>
{products.map((product) => (
<View key={product.id} style={styles.card}>
<Image source={{ uri: product.image }} />
<Text>{product.name}</Text>
</View>
))}
</View>
);
const styles = StyleSheet.create({
grid: {
flexDirection: 'row',
flexWrap: 'wrap',
justifyContent: 'space-between',
},
card: { width: '48%', marginBottom: 16 },
});
Dans cet exemple, le View externe avec flexWrap: wrap fonctionne comme un analogue de CSS Grid. Chaque carte occupe 48% de la largeur, laissant des espaces entre les colonnes. C'est un motif typique pour les catalogues et les flux de contenu.
Questions fréquentes
View a flexDirection: column par défaut (pas row comme un conteneur flex en HTML), ne supporte pas le défilement, la largeur par défaut s'étend à 100% du parent, et les ombres sont définies via les propriétés shadow* sur iOS et elevation sur Android.
Oui, View prend en charge la gestion des événements tactiles via onTouchStart, onTouchEnd et le système Responder. Cependant, pour les boutons, il est préférable d'utiliser TouchableOpacity, Pressable ou Button — ils fournissent un retour visuel et sont conformes à l'API d'accessibilité.
Pas nécessairement. React Native optimise le rendu via View flattening — les Views supplémentaires sans styles ni événements sont supprimés de l'arbre natif. Cependant, pour la lisibilité du code, il est préférable d'utiliser View comme conteneurs pour les blocs d'interface logiques.
Définissez borderRadius égal à la moitié de la largeur et de la hauteur (par exemple, width: 50, height: 50, borderRadius: 25). Si la largeur et la hauteur sont égales, le View devient un cercle. C'est le motif standard pour les avatars.
Définissez opacity de 0 à 1 (par exemple, opacity: 0.5). Vous pouvez également utiliser backgroundColor avec RGBA (backgroundColor: 'rgba(0,0,0,0.5)'). La différence est que opacity s'applique à tout le conteneur et son contenu, tandis que RGBA s'applique uniquement à l'arrière-plan.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi