React Native
React Native
React Native est une librairie javascript qui permet de créer des application mobile (Android & IOS)
Elle utilise Javascript et React
React Native
Pour utiliser React Native, il existe un outil très pratique : Expo
React Native
Avant de commencer quelques liens utiles :
React Native
Avant de commencer quelques liens utiles :
- La documentation officiel de React
React Native
Installation
React Native
Installation
Pour installer react native il faut d'abord installer expo :
yarn global add expo-cli
# ou npm
npm install -g expo-cliEnsuite nous pouvons créer un projet react native grâce à expo :
expo init NomDuProjetReact Native
Installation
Pour lancer l'application, se rendre à la racine du projet
yarn start
# ou avec npm
npm startReact Native
Installation
Structure d'un projet React Native

Contient les dépendances javascript ainsi que la configuration de yarn et npm
C'est ici que sont noté toutes les librairies javascript nécessaire pour démarrer une application React Native
React Native
Installation
Structure d'un projet React Native

Contient la configuration de Babel
React Native
Installation
Structure d'un projet React Native

Contient la configuration générale de l'application mobile
React Native
Installation
Structure d'un projet React Native

Voici le fichier javascript Principal !
Contient le composant principal de notre application
React Native
Installation
Structure d'un projet React Native

Définie les fichiers qui ne doivent pas être versionnés par git
React Native
Installation
Structure d'un projet React Native

Contiendra tout notre code Javascript
React Native
Installation
Structure d'un projet React Native

Contient toutes les librairies javascript
React Native
Installation
Structure d'un projet React Native

Contient les assets : images, fonts, videos etc .... de notre application
React Native
Installation
Structure d'un projet React Native

Se sont des répertoires interne pour expo afin de stocker des informations

React Native
JSX
React Native
JSX
import React from 'react'
import { Text, View } from 'react-native'
const element = (
<View>
<Text>Bonjour !</Text>
<Text>Content de te voir ici.</Text>
</View>
);Le JSX est une syntaxe très proche de HTML utilisé pour afficher des composants
React Native
JSX
import React from 'react'
import { Text, View } from 'react-native'
const element = (
<View>
<Text>Bonjour !</Text>
<Text>Content de te voir ici.</Text>
</View>
);
const element = React.createElement(View, {}, [
React.createElement(Text, {}, ['Bonjour !']),
React.createElement(Text, {}, ['Content de te vois ici.']),
])En vrai, JSX ce compile en javacript :
React Native
JSX
const name = 'John Doe'
const element = (
<div>
<h1>Bonjour {name} !</h1>
<h2>Content de te voir ici.</h2>
</div>
);Il est possible d'afficher des variables en JSX :
React Native
JSX
const name = 'John Doe'
const element = (
<div id="super-div">
<h1>Bonjour {name} !</h1>
<h2>Content de te voir ici.</h2>
</div>
);Il est possible aussi de définir des attributs
React Native
JSX
const name = 'John Doe'
const id = 'super-div'
const element = (
<div id={id}>
<h1>Bonjour {name} !</h1>
<h2>Content de te voir ici.</h2>
</div>
);Les variables peuvent aussi être utilisées dans les attributs
React Native
JSX
const users = ['john', 'jane', 'rose']
const element = (
<div>
<p>Liste des utilisateurs</p>
<ul>
{users.map((user) => (
<li key={`utilisateur-${user}`}>{user}</li>
))}
</ul>
</div>
)
Il est possible de faire des boucles en utilisant la méthode map d'un tableaux
React Native
JSX
const users = ['john', 'jane', 'rose']
const element = (
<div>
<p>Liste des utilisateurs</p>
<ul>
{users.map((user) => (
<li key={`utilisateur-${user}`}>{user}</li>
))}
</ul>
</div>
)
Boucle sur le tableaux
React Native
JSX
const users = ['john', 'jane', 'rose']
const element = (
<div>
<p>Liste des utilisateurs</p>
<ul>
{users.map((user) => (
<li key={`utilisateur-${user}`}>{user}</li>
))}
</ul>
</div>
)
Attention, il est obligatoire de rajouter un attribut key au composant d'une boucle !
Cette attribut doit-être unique
React Native
Les composant
React Native
Les composant
import React from 'react'
export const Hello = () => {
return <h1>Bonjour</h1>
}Exemple de composant react
React Native
Les composant
import React from 'react'
export const Hello = () => {
return <h1>Bonjour</h1>
}Cette première ligne importe la librairie React.
Cette ligne est obligatoire pour tout composant
React Native
Les composant
import React from 'react'
export const Hello = () => {
return <h1>Bonjour</h1>
}Ici nous exportons une fonction Hello
React Native
Les composant
import React from 'react'
export const Hello = () => {
return <h1>Bonjour</h1>
}Cette fonction retourne du JSX
React Native
Les composant
import React from 'react'
export const Hello = () => <p>Bonjour</p>
export const AutreComposant = () => {
return <Hello />
}
Utiliser un composant
React Native
Les composant
import React from 'react'
export const Hello = ({ name }) => {
return <p>Bonjour {name}</p>
}
export const AutreComposant = () => {
return <Hello name='John' />
}
Les props
React Native
Les composant
import React from 'react'
export const Hello = ({ name }) => {
return <p>Bonjour {name}</p>
}
export const AutreComposant = () => {
return <Hello name='John' />
}
Passage d'une props au composant Hello
React Native
Les composant
import React from 'react'
export const VeryBigTitle = ({ children }) => {
return (
<div className='very-big-title'>
<h1>{children}</h1>
</div>
)
}
export const AutreComposant = () => {
return <VeryBigTitle>Hello</VeryBigTitle>
}
Les children (enfants)
React Native
Les composant
import React from 'react'
export const VeryBigTitle = ({ children }) => {
return (
<div className='very-big-title'>
<h1>{children}</h1>
</div>
)
}
export const AutreComposant = () => {
return <VeryBigTitle>Hello</VeryBigTitle>
}
Passage d'enfant à un composant "VeryBigTitle"
React Native
Les composant
import React from 'react'
export const SuperInput = ({ onPress }) => {
return (
<button onClick={onPress}>Click me</button>
)
}
export const AutreComposant = () => {
return <SuperInput onPress={() => console.log('pressed')} />
}
Passage de fonction en props (callback)
React Native
Les composant
import React from 'react'
export const SuperInput = ({ onPress, ...restProps }) => {
return (
<button onClick={onPress} {...restProps}>Click me</button>
)
}
export const AutreComposant = () => {
return <SuperInput
className="super-bouton"
onPress={() => console.log('pressed')}
/>
}
Il est possible d'utiliser le "rest operator" (...) pour passer des props
React Native
Les composant
import React from 'react'
export const SuperInput = ({ onPress, ...restProps }) => {
return (
<button onClick={onPress} {...restProps}>Click me</button>
)
}
export const AutreComposant = () => {
return <SuperInput
className="super-bouton"
onPress={() => console.log('pressed')}
/>
}
On ajoute à notre SuperInput une props "className"
React Native
Les composant
import React from 'react'
export const SuperInput = ({ onPress, ...restProps }) => {
return (
<button onClick={onPress} {...restProps}>Click me</button>
)
}
export const AutreComposant = () => {
return <SuperInput
className="super-bouton"
onPress={() => console.log('pressed')}
/>
}
On récupére la props onPress et on met toutes les autres props dans une variable "restProps"
React Native
Les composant
import React from 'react'
export const SuperInput = ({ onPress, ...restProps }) => {
return (
<button onClick={onPress} {...restProps}>Click me</button>
)
}
export const AutreComposant = () => {
return <SuperInput
className="super-bouton"
onPress={() => console.log('pressed')}
/>
}
Ici on attache la props "onClick" à la fonction de la props "onPress"
React Native
Les composant
import React from 'react'
export const SuperInput = ({ onPress, ...restProps }) => {
return (
<button onClick={onPress} {...restProps}>Click me</button>
)
}
export const AutreComposant = () => {
return <SuperInput
className="super-bouton"
onPress={() => console.log('pressed')}
/>
}
On passe toutes les autres props à notre composant button
React Native
Les composant
// Hello.js
import React from 'react'
export default ({
age,
name = 'Stranger',
}) => {
return (
<div className='very-big-title'>
<h1>{children}</h1>
</div>
)
}
Quelques bonnes pratique !
React Native
Les composant
// Hello.js
import React from 'react'
export default ({
age,
name = 'Stranger',
}) => {
return (
<div className='very-big-title'>
<h1>{children}</h1>
</div>
)
}
Le nom du fichier correspond au nom du composant.
Un fichier = Un Composant
React Native
Les composant
// Hello.js
import React from 'react'
export default ({
age,
name = 'Stranger',
}) => {
return (
<div className='very-big-title'>
<h1>{children}</h1>
</div>
)
}
Ne pas oublier d'importer la librairie React, sinon il est impossible d'écrire du JSX
React Native
Les composant
// Hello.js
import React from 'react'
export default ({
age,
name = 'Stranger',
}) => {
return (
<div className='very-big-title'>
<h1>{children}</h1>
</div>
)
}
Exporter par défaut la fonction composant !
React Native
Les composant
// Hello.js
import React from 'react'
export default ({
age,
name = 'Stranger',
}) => {
return (
<div className='very-big-title'>
<h1>{children}</h1>
</div>
)
}
Destructurer TOUTES les props !
Mettre les props obligatoire en premier et les facultative (valeur par défaut) en dessous
React Native
Les composant
Les composants react native
En React Native il est impossible de faire du HTML
Pour cela nous devons utiliser les composants React Native
React Native
Les composant
Exemple d'utilisation
import React from 'react'
import { Text, View } from 'react-native'
export default ({ age, name = 'john' }) => {
return (
<View>
<Text>Hello {name}, you are {age} years old</Text>
</View>
)
}React Native
Les composant
Les feuilles de styles
import React from 'react'
import { Text, View, StyleSheet } from 'react-native'
export default ({ age, name = 'john' }) => {
return (
<View>
<Text>Hello {name}, you are {age} years old</Text>
</View>
)
}
export const styles = StyleSheet.create({
container: {
backgroundColor: 'blue',
},
helloText: {
color: 'green',
fontSize: '20px',
}
})React Native
Les composant
On importe StyleSheet depuis react native
import React from 'react'
import { Text, View, StyleSheet } from 'react-native'
export default ({ age, name = 'john' }) => {
return (
<View>
<Text>Hello {name}, you are {age} years old</Text>
</View>
)
}
export const styles = StyleSheet.create({
container: {
backgroundColor: 'blue',
},
helloText: {
color: 'green',
fontSize: '20px',
}
})React Native
Les composant
Nous créons une feuille de style avec StyleSheet.create
import React from 'react'
import { Text, View, StyleSheet } from 'react-native'
export default ({ age, name = 'john' }) => {
return (
<View>
<Text>Hello {name}, you are {age} years old</Text>
</View>
)
}
export const styles = StyleSheet.create({
container: {
backgroundColor: 'blue',
},
helloText: {
color: 'green',
fontSize: '20px',
}
})React Native
Les composant
Nous définissons une suite de style un peu comme un feuille CSS (ici, container et helloText)
import React from 'react'
import { Text, View, StyleSheet } from 'react-native'
export default ({ age, name = 'john' }) => {
return (
<View>
<Text>Hello {name}, you are {age} years old</Text>
</View>
)
}
export const styles = StyleSheet.create({
container: {
backgroundColor: 'blue',
},
helloText: {
color: 'green',
fontSize: 20,
}
})React Native
Les composant
Les propriétés CSS sont écrites en camel case (elle ne contienne le trait d'union)
import React from 'react'
import { Text, View, StyleSheet } from 'react-native'
export default ({ age, name = 'john' }) => {
return (
<View>
<Text>Hello {name}, you are {age} years old</Text>
</View>
)
}
export const styles = StyleSheet.create({
container: {
backgroundColor: 'blue',
},
helloText: {
color: 'green',
fontSize: 20,
}
})React Native
Les composant
En react native, l'unité de mesure est uniquement le pixel !!!
On ne spécifie jamais "px", on spécifié toujours un number lorsque cette propriété est orpheline
import React from 'react'
import { Text, View, StyleSheet } from 'react-native'
export default ({ age, name = 'john' }) => {
return (
<View>
<Text>Hello {name}, you are {age} years old</Text>
</View>
)
}
export const styles = StyleSheet.create({
container: {
backgroundColor: 'blue',
},
helloText: {
color: 'green',
fontSize: 20,
}
})React Native
Les composant
Nous attachons des styles grace à l'attribut styles
import React from 'react'
import { Text, View, StyleSheet } from 'react-native'
export default ({ age, name = 'john' }) => {
return (
<View style={styles.container}>
<Text style={styles.helloText}>Hello {name}, you are {age} years old</Text>
</View>
)
}
export const styles = StyleSheet.create({
container: {
backgroundColor: 'blue',
},
helloText: {
color: 'green',
fontSize: '20px',
}
})React Native
Le State
React Native
Le State
En React et React Native il est possible de déclarer des variables qui peuvent changer avec le temps et impacter notre interface
Ces variables portent le nom de State
Elle se déclare avec le hooks useState
React Native
Le State
import React, { useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
</View>
<View>
<Text>Votre mot de passe :</Text>
<TextInput value={password} onChangeText={setPassword} />
</View>
<View>
<Button title='Connexion' />
</View>
</View>
)
}
Exemple : Un formulaire de login
React Native
Le State
import React, { useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
</View>
<View>
<Text>Votre mot de passe :</Text>
<TextInput value={password} onChangeText={setPassword} />
</View>
<View>
<Button title='Connexion' />
</View>
</View>
)
}
Nous importons React et useState
React Native
Le State
import React, { useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
</View>
<View>
<Text>Votre mot de passe :</Text>
<TextInput value={password} onChangeText={setPassword} />
</View>
<View>
<Button title='Connexion' />
</View>
</View>
)
}
Nous utilisons useState
React Native
Le State
import React, { useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
</View>
<View>
<Text>Votre mot de passe :</Text>
<TextInput value={password} onChangeText={setPassword} />
</View>
<View>
<Button title='Connexion' />
</View>
</View>
)
}
useState retourne un tableaux de 2 valeurs :
1. La valeur
2. Un fonction pour mettre à jour la valeur et l'interface
React Native
Le State
import React, { useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
</View>
<View>
<Text>Votre mot de passe :</Text>
<TextInput value={password} onChangeText={setPassword} />
</View>
<View>
<Button title='Connexion' />
</View>
</View>
)
}
La fonction useState accèpte en paramètre un valeur par défaut
React Native
Le State
import React, { useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
</View>
<View>
<Text>Votre mot de passe :</Text>
<TextInput value={password} onChangeText={setPassword} />
</View>
<View>
<Button title='Connexion' />
</View>
</View>
)
}
Nous changeons nos états grâce au fonction "setEmail" et "setPassword"
React Native
Les Effect
React Native
Les Effect
Les effets sont de simple fonctions qui se déclenche lorsque une ou plusieurs variables changent de valeurs
Elles peuvent avoir des rôles divers et variés mais sont généralement utilisé pour effectuer toutes les taches que l'utilisateur ne voit pas
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [emailError, setEmailError] = useState('')
useEffect(() => {}, [email])
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
{!!emailError && <Text>{emailError}</Text>}
</View>
{/* ... */}
</View>
)
}
Exemple de useEffect : La validation d'un email
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [emailError, setEmailError] = useState('')
useEffect(() => {}, [email])
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
{!!emailError && <Text>{emailError}</Text>}
</View>
{/* ... */}
</View>
)
}
Nous importons le hooks "useEffect" de react
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [emailError, setEmailError] = useState('')
useEffect(() => {}, [email])
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
{!!emailError && <Text>{emailError}</Text>}
</View>
{/* ... */}
</View>
)
}
Nous déclarons un "effect" qui accépte 2 arguments
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [emailError, setEmailError] = useState('')
useEffect(() => {}, [email])
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
{!!emailError && <Text>{emailError}</Text>}
</View>
{/* ... */}
</View>
)
}
Le premier est la fonction qui contiendra le code de notre effect (validation de l'email)
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [emailError, setEmailError] = useState('')
useEffect(() => {}, [email])
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
{!!emailError && <Text>{emailError}</Text>}
</View>
{/* ... */}
</View>
)
}
Le second est un tableaux qui définie les variables qui déclencherons l'effect
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [emailError, setEmailError] = useState('')
useEffect(() => {}, [email])
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
{!!emailError && <Text>{emailError}</Text>}
</View>
{/* ... */}
</View>
)
}
Ici, l'effect se déclenchera à chaque changement de notre variable "email"
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [emailError, setEmailError] = useState('')
useEffect(() => {}, [])
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
{!!emailError && <Text>{emailError}</Text>}
</View>
{/* ... */}
</View>
)
}
ATTENTION
Un effet attaché à un tableaux vide se déclenchera au premier affichage de notre composant seulement !
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
const [email, setEmail] = useState('')
const [emailError, setEmailError] = useState('')
useEffect(() => {
if (!email) {
setEmailError('Vous devez spécifier un email')
}
if (!/^[^@ ]+@[^@]+\.[a-zA-Z0-9]+$/.test(email)) {
setEmailError('Invalide email')
}
}, [email])
return (
<View>
<View>
<Text>Votre email :</Text>
<TextInput value={email} onChangeText={setEmail} />
{!!emailError && <Text>{emailError}</Text>}
</View>
{/* ... */}
</View>
)
}
Voici le code finale de vérification :
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
useEffect(() => {
console.log('démarrage de l\'effet')
return () => {
console.log('fin de l\'effet')
}
}, [])
return (
<View>
{/* ... */}
</View>
)
}
Il est possible avec useEffect de définir une fonction qui s'éxécutera à la fin de notre effet
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
useEffect(() => {
console.log('démarrage de l\'effet')
return () => {
console.log('fin de l\'effet')
}
}, [])
return (
<View>
{/* ... */}
</View>
)
}
Ici, cette ligne s'éxécute lorsque le composant s'affiche
React Native
Les Effect
import React, { useEffect, useState } from 'react'
import { TextInput, View } from 'react-native'
export default () => {
useEffect(() => {
console.log('démarrage de l\'effet')
return () => {
console.log('fin de l\'effet')
}
}, [])
return (
<View>
{/* ... */}
</View>
)
}
Ici cette fonction sera lancé lorsque le composant se dés-affiche
React Native
By David Jegat
React Native
- 185