Skip to content

Commit dab5ebd

Browse files
Add readme for redux part
1 parent 4140a61 commit dab5ebd

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

step-5/readme.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Step 5 : redux
2+
3+
dans cette étape, nous allons intégrer [Redux](http://redux.js.org/index.html) a notre magnifique application.
4+
5+
[Redux](http://redux.js.org/index.html) est un container d'état global pour des applications JavaScript.
6+
Redux peut être utilisé dans n'importe quel environnement et ne dépend pas de React. Redux possède quelques
7+
propriétés très intéressantes en matière de cohérence, de prévisibilité et d'expérience du développeur.
8+
9+
Redux peut être vu comme une implémentation du [pattern Flux](https://facebook.github.io/flux/docs/overview.html) avec cependant quelques variations, notamment au niveau de la complexité de mise en place bien moindre que Flux. Redux s'inspire également de patterns propre au langage Elm
10+
11+
Redux fourni un concept de `store` de données unique pour l'application (singleton), auquel nos composants vont s'abonner. Il est ensuite possible de dispatcher des `actions` sur ce `store` qui déclencheront une mutation de l'état contenu dans le `store`. Une fois la mutation effectuée, le `store` notifiera tous ses abonnés du changement d'état. L'intérêt d'un tel pattern devient évident lorsqu'une application grossit et que plusieurs composants React ont besoin d'une même source de données. Il est alors plus simple de gérer l'état `fonctionnel` de l'application en dehors des composants et de s'y abonner.
12+
13+
Pour fonctionner Redux utilise une notion de `reducer` qui fonctionne exactement de la même facon qu'une fonction de réduction sur une collection. Si on visualise l'état de l'application comme une collection de mutations, le `reducer` est simplement la fonction qui prend en paramètre l'état précédant et retourne le prochain état via un second paramètre qui dans notre cas est une `action`. Un `reducer` est donc une fonction pure avec la signature suivante `(state, action) => state` qui décrit comment une action transforme l'état courant en un nouvel état.
14+
15+
Regardons un exemple simple
16+
17+
```javascript
18+
import { createStore } from 'redux'
19+
20+
/**
21+
* Ici nous avons un unique reducer qui va gérer un état de type number. On note que l'état initial est fourni
22+
* on utilise un switch pour gérer les différentes actions, mais ce n'est absolument pas obligatoire
23+
* A noter qu'il est impératif lors d'une mutation d'état de renvoyer un nouvel état et non l'ancien état muté.
24+
*/
25+
function counter(state = 0, action) {
26+
switch (action.type) {
27+
case 'INCREMENT':
28+
return state + 1
29+
case 'DECREMENT':
30+
return state - 1
31+
default:
32+
return state
33+
}
34+
}
35+
36+
// Ici nous créons un store pour notre application se basant sur le reducer `counter`
37+
// l'API du store est la suivante { subscribe, dispatch, getState }.
38+
let store = createStore(counter)
39+
40+
// Maintenant nous pouvons nous abonner aux modifications de l'état contenu dans le store.
41+
// Un cas d'usage pourrait être un composant react qui veut afficher l'état courant du compteur.
42+
// On note que le nouvel état n'est pas véhiculer dans le callback mais qu'il faut aller le chercher
43+
// directement sur le store.
44+
store.subscribe(() =>
45+
console.log(store.getState())
46+
)
47+
48+
// Maintenant, le seul moyen de muter l'état interne du store est de lui envoyer une action
49+
store.dispatch({ type: 'INCREMENT' })
50+
// afficher 1 dans la console
51+
store.dispatch({ type: 'INCREMENT' })
52+
// afficher 2 dans la console
53+
store.dispatch({ type: 'DECREMENT' })
54+
// afficher 1 dans la console
55+
```
56+
57+
Il est bien évidemment possible d'avoir plusieurs `reducers`, ou de faire en sorte qu'un reducer ne soit en charge que d'une partie de l'état global, etc ...

0 commit comments

Comments
 (0)