Développement d'applications mobiles

Développement d'applications mobiles


2- Introduction à React Native

3- Interface Utilisateur

4- Réactivité

JSX

JavaScript XML, permets d'entrelaçer des balises avec le code JavaScript et d'encapsuler les responsabilités via les components

Component

Un component est défini par une fonction dont le nom commence par une MAJUSCULE, qui retourne du JSX

jsx
copier
function FormField() {
return (
<View>
<Text>Label:</Text>
<TextInput />
</View>
)
}

// Usage

<FormField></FormField>
<FormField></FormField>
// ou
<FormField />
<FormField />

Les 2 accolades {{ ... }} intègrent un objet JavaScript

jsx
copier
function FormField() {
return (
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
<Text>Label:</Text>
<TextInput style={{ borderWidth: 1, flexGrow: 1 }} />
</View>
)
}

Props

Les components peuvent recevoir des paramètres via les props

jsx
copier
function FormField(props) {
return (
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
<Text>{ props.label } :</Text>
<TextInput style={{ borderWidth: 1, flexGrow: 1 }} />
</View>
)
}

// Usage

<FormField label="a"></FormField>
<FormField label="b"></FormField>
<FormField label="c" />

On peut simplifier l'accès aux props via le destructuring

jsx
function FormField({ label }) {
return (
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
<Text>{ label } :</Text>
<TextInput style={{ borderWidth: 1, flexGrow: 1 }} />
</View>
)
}

On peut fournir du contenu au component, accessible via la prop children

jsx
copier
function FormField({ label, children }) {
return (
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>
<Text>{ label } :</Text>
{ children }
</View>
)
}

// Usage

<FormField label="Text">
<TextInput style={{ borderWidth: 1, flexGrow: 1 }} />
</FormField>

<FormField label="Switch">
<Switch />
</FormField>

// ...

{
[
{
label: 'Text',
field: <TextInput style={{ borderWidth: 1, flexGrow: 1 }} />
},
{
label: 'Switch',
field: <Switch />
}
].map( ({label, field}) => (
<FormField key={ label } label={ label } >
{ field }
</FormField>
))
}

📚 Balises JSX

📚 JavaScript JSX

Expressions

On peut également intégrer la logique à l'intérieur du JSX via les accolades { ... }. On peut intégrer des expressions JS dans le JSX, donc des énoncés de code qui retournent une valeur.

jsx
copier
function FormField({ label, children }) {

function format() {
if (label) {
return <Text>{ label.toUpperCase() } :</Text>
}
}

return (
<View style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}>

{ /* Ternaire */ }
{ label ? <Text>{ label.toUpperCase() } :</Text> : null }

{ /* Court circuit */ }
{ label && <Text>{ label.toUpperCase() } :</Text> }

{ /* Appel de fonction */ }
{ format() }

{ children }
</View>
)
}

// Usage

<FormField>
<Switch />
</FormField>

Mise en page

On retrouve la plupart des propriétés CSS en React Native. On utilise 2 unités de mesure les DIP fontSize: 24 par défaut, et les % width: '50%'

📚 Styles

📚 Dimensions

On utilise Flexbox qui permets de distribuer des éléments sur un axes et de contrôler leur positionnement via plusieurs propriétés CSS.

https://flexbox.malven.co/

📚 Flexbox

Guide interatif Flexbox

React Native propose un ensemble de components par défaut, mais ils ne répondent pas nécessairement à tous les besoins. Il est commun d'utiliser des librairies de composants pour accélérer et uniformiser la mise en place de l'interface de l'application.

📚 Référence components et attributs

Icônes

Expo intègre une librairie d'icônes exhaustive et facile d'utilisation

jsx
copier
import { FontAwesome5 } from '@expo/vector-icons';

// ...

<FontAwesome5 name="smile" size={24} color="black" />

📚 Expo Vector Icons

📚 Liste des icônes

Go


Neutre
Bouton pressé
Voir les boîtes


Neutre
Bouton pressé
Voir les boîtes