Académique Documents
Professionnel Documents
Culture Documents
https://www.welcometothejungle.com/fr/companies/agence-belle-epoque/jobs
2
Déroulement
▫ Théorie + pratique
▫ Démos et exercices pour du concret
▫ Interaction / poser des questions
▫ Aidez-vous
3
Plan
▫ Pourquoi React
▫ Rappel ES6
▫ Installation
▫ Props & State
▫ React Lifecycle
▫ CSS
▫ React Router
▫ React avancé en fonction du temps : Redux, animations, SSR, tests…
4
Pourquoi
React
Commençons par la base
L’essentiel
6
Quelques grands principes
▫ Approche composant
▫ Virtual DOM
7
La librairie Javascript la plus plébiscitée
https://2019.stateofjs.com/front-end-frameworks/
8
Les meilleurs
utilisent React
9
De sacrées possibilités
▫ React Native
▫ Progressive Web Apps
▫ React pour la VR
▫ React pour l’IoT
10
Une multitude de modules et d’outils
▫ Redux
▫ Reselect
▫ React Router
▫ Material UI
▫ Storybook
▫ Jest
11
Rappel ES6
Les bases
12
ES6 Pourquoi ?
▫ Plus facile
▫ Plus puissant
▫ Plus fiable
▫ Plus performant
13
Babel
14
Const ou Let :
telle est la question
15
Littéraux
➔ Simple quote ‘pour simple texte’ const maConstante = 'deux';
console.log(`ligne de texte 1
➔ Double quote avec attr=”Attribut” de ligne de texte ${maConstante}`);
balise non dynamique
"ligne de texte 1
➔ Backtick `avec des ${variables} et des ligne de texte deux"
textes sur plusieurs lignes`
16
The Spread Syntax
console.log(arr); console.log(arr);
17
The Spread Syntax Object
React :
<TodoItem key={todo.id} todo={todo} {...trainer} />
18
Destructuring
var person = {
firstName: 'John',
secondName: 'Smith',
age: 33,
children: 3,
profession: 'teacher'
}
printBasicInfo(person); 19
Destructuring 2
20
Arrow function
<TodoTextInput text={todo.text}
editing={(text) => this.handleSave(todo.id, text)} />
21
Classes
23
Export / Import
// Import intégral dans une "namespace"
export function addTodo () {
import * as types from
return { type: types.ADD_TODO,
'../constants/ActionsTypes';
text }
}
// Ou juste un des deux modes :
import Footer from './Footer;
export const ADD_TODO =
import { ADD_TODO } from
'ADD_TODO';
'../contants/TodoFilters';
export default Footer;
24
Async / Await
function sendEmails(query) { async function sendEmails(query) {
const usersP = getUsers(query); const users = await getUsers(query);
// On récupère le champ "email" de tous les const emails = users.map(u => u.email);
utilisateurs const sentP = emails.map(email =>
const emailsP = usersP.then(users => sendMail(email, "Bonne fête"));
users.map(u => u.email)); return await Promise.all(sentP);
// Pour chaque email… }
const sentP = emailsP.then(emails =>
emails.map(email => { async function main() {
// … on envoie un mail try {
return sendMail(email, "Bonne fête"); await sendEmails({ firstName:
}) "Edouard" });
); console.log("OK");
// On attend que tous les envois soient } catch (e) {
résolus console.error("FAIL");
return Promise.all(sentP); }
} }
26
nvm > npm & node
https://github.com/nvm-sh/nvm
https://nodejs.org/en/
27
Create React App
npm install
npm start
28
Architecture
my-app
├── README.md
├── node_modules
├── package.json
├── .gitignore
├── public
│ └── favicon.ico
│ └── index.html
│ └── manifest.json
└── src
└── App.css
└── App.js
└── App.test.js
└── index.css
└── index.js
└── logo.svg
└── registerServiceWorker.js
29
ESLint config
https://bitbucket.org/snippets/lebrenn/8eara8
https://www.npmjs.com/package/eslint-config-prettier
30
Props & State
31
Props & state
handleClick(e) {
this.props : contient toutes les propriétés e.preventDefault();
disponibles d’un composant. Elles sont this.setState({ monEtat1: 'Nouvelle valeur' });
}
modifiables par le composant parent
render() {
this.state : contient tous les états return (
disponibles d’un composant. Ils peuvent <button onClick={(e) => this.handleClick(e)}>
changer au sein du composant <MonComposantEnfant
maProp1={this.state.monEtat1} />
</button>
);
}
32
Using State Correctly
// Wrong
this.state.comment = 'Hello';
// Correct
this.setState({comment: 'Hello'});
// Correct
this.setState((prevState, props) => ({
counter: prevState.counter + props.increment
}));
33
Demo
34
Exercice
35
CSS avec React
Qu’est ce qui change
36
CSS
Ou utiliser styled-component
37
Un peu de design
38
React Lifecycle
39
Les méthodes
React fournit des méthodes qui sont appelées pendant le cycle de vie d’un composant
40
Component Lifecycle
http://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/
41
render()
render() {
return (
<div>
<h1>Hello, world!</h1>
<h2>It is {this.state.date.toLocaleTimeString()}.</h2>
</div>
);
}
} 42
componentDidMount()
componentDidMount() {
this.timerID = setInterval(
() => this.tick(),
1000
);
}
43
componentWillUnmount()
componentWillUnmount() {
clearInterval(this.timerID);
}
44
// when the component is removed from the DOM...
componentWillUnmount() {
window.removeEventListener("resize", () =>
Longueur / Largeur this.onResizeHandler());
}
onResizeHandler() {
constructor(props) { const w = document.documentElement.clientWidth;
super(props); const h =
this.state = { document.documentElement.clientHeight;
w: null, console.log("The window has been resized!", {
h: null w,
}; h
} });
this.setState({ w, h });
componentWillMount() { }
// Force to get first document size.
this.onResizeHandler(); render() {
} const { w, h } = this.state;
return (
// when the component is added to the DOM... <ul>
componentDidMount() { <li>Width: {w}</li>
window.addEventListener("resize", () => <li>Height: {h}</li>
this.onResizeHandler()); </ul>
} ); 45
}
Exercice
46
React Router
47
Installation
48
React Router Composant
Fournit des composants pour nous aider à construire l’architecture de nos pages
49
Afficher un <Router>
50
L’<App>
51
Routes
52
Path
Une <Route> attend une chaîne prop path qui décrit le type de chemin correspondant à l'itinéraire
Exemple :
53
Links
React Router dispose d’un composant <Link> pour faire des liens sans rechargement de page
render() {
const singleId = this.props.routeParams.singleId;
}
55
Exercice
Créer un petit site simple avec une page d’accueil, une page blog avec des articles.
Lorsque l’on clique sur un article, on a la page single.
56
Tests unitaires
57
Pourquoi faire des tests unitaires
58
Jest - Avantages
▫ Très rapide
▫ Snapshot
▫ “Watch mode” qui retourne seulement les tests qui sont pertinents pour vos
changements.
▫ Messages d’erreurs utiles
▫ Configuration simple
▫ Mocks et spies
▫ Coverage report with a single command line switch.
59
Redux
60
Dispatch
Plusieurs possibilités :
▫ Passer simplement la méthode au composant
▫ Créer un composant connecté
61
Dispatch : la méthode simple
// App.js
import { createStore } from 'redux';
import { MessageSending } from './MessageSending';
import reducer from './reducer';
// MessageSending.js
import { sendMessage } from './actions';
// ...
this.props.store.dispatch(sendMessage(message))
// ...
62
Le concept
63
Dispatch, la méthode recommandée
Le composant connecté
// MessageSendingConnected.js
import { connect } from 'react-redux';
import { sendMessage } from './actions';
import MessageSending from './MessageSending';
const mapDispatchToProps = {
sendMessage,
};
66
Store
return {
displayTemplate,
displayName,
};
};
export default connect(mapStateToProps)(Page); 68
Exercice
69
Animations
70
L’UX et l’UI sont au coeur des applications
71
Avant de commencer
72
Mais ne surchargez pas votre app
73
Evitez les animations trop longues
74
Animation CSS basée sur les états de React
▫ Le plus simple
▫ Parfait pour des animations basiques
▫ Performant
▫ Ne surcharge pas
75
Exemple du Menu
76
Transition Group
Documentation : https://reactcommunity.org/react-transition-group/
77
Transition
78
Transition
79
Transition
in={this.state.enterAnimation}> opacity: 0;
<h1>test</h1> .fade-entered {
</div> opacity: 1;
)} }
</Transition> .fade-entering {
opacity: 0;
}
80
Transition Group
81
CSS Transition
82
CSS Transition
<CSSTransition .fade-enter {
{...props} opacity: 0.01;
timeout={1000} }
classNames="fade"
> .fade-enter.fade-enter-active {
{children} opacity: 1;
</CSSTransition> transition: opacity 1000ms ease-in;
}
.fade-exit {
opacity: 1;
}
.fade-exit.fade-exit-active {
opacity: 0.01;
transition: opacity 800ms ease-in;
}
83
React Motion
84
“
For 95% of use-cases of animating components, we don't have to resort to using hard-
coded easing curves and duration.
Set up a stiffness and damping for your UI element, and let the magic of physics take
care of the rest.
This way, you don't have to worry about petty situations such as interrupted animation
behavior. It also greatly simplifies the API.
Cheng Lou
85
React Motion
86
GSAP
▫ Fait tout
▫ Possibilité de régler la vitesse, le style de l’animation…
▫ Se couple parfaitement avec React Transition Group
87
Beaucoup d’autres librairies
▫ Velocity
▫ Animated
▫ ...
88
Exercice
89
Merci
Vous pouvez nous contacter et postuler
▫ hello@agence-belle-epoque.fr
▫ https://www.welcometothejungle.com/fr/companies/agence-belle-epoque/jobs
90