|
| 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