UNPKG

vuex-help

Version:

a utilies library reduce boilerplate for vuex

534 lines (249 loc) 19.8 kB
<!DOCTYPE HTML> <html lang="fr" > <head> <meta charset="UTF-8"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <title>Vuex, qu'est-ce que c'est ? · Vuex</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="description" content=""> <meta name="generator" content="GitBook 3.2.3"> <link rel="stylesheet" href="../gitbook/style.css"> <link rel="stylesheet" href="../gitbook/gitbook-plugin-prism/prism.css"> <link rel="stylesheet" href="../gitbook/gitbook-plugin-search/search.css"> <link rel="stylesheet" href="../gitbook/gitbook-plugin-theme-vuejs/vue.css"> <meta name="HandheldFriendly" content="true"/> <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../gitbook/images/apple-touch-icon-precomposed-152.png"> <link rel="shortcut icon" href="../gitbook/images/favicon.ico" type="image/x-icon"> <link rel="next" href="getting-started.html" /> <link rel="prev" href="installation.html" /> </head> <body> <div class="book"> <div class="book-summary"> <div id="book-search-input" role="search"> <input type="text" placeholder="Tapez pour rechercher" /> </div> <nav role="navigation"> <script async type="text/javascript" src="//cdn.carbonads.com/carbon.js?zoneid=1673&serve=C6AILKT&placement=vuejs" id="_carbonads_js"></script> <ul class="summary"> <li class="chapter " data-level="1.1" data-path="./"> <a href="./"> Introduction </a> </li> <li class="chapter " data-level="1.2" > <a target="_blank" href="https://github.com/vuejs/vuex/releases"> Notes de version </a> </li> <li class="chapter " data-level="1.3" data-path="installation.html"> <a href="installation.html"> Installation </a> </li> <li class="chapter active" data-level="1.4" data-path="intro.html"> <a href="intro.html"> Vuex, qu'est-ce que c'est ? </a> </li> <li class="chapter " data-level="1.5" data-path="getting-started.html"> <a href="getting-started.html"> Pour commencer </a> </li> <li class="chapter " data-level="1.6" data-path="core-concepts.html"> <a href="core-concepts.html"> Concepts de base </a> <ul class="articles"> <li class="chapter " data-level="1.6.1" data-path="state.html"> <a href="state.html"> État </a> </li> <li class="chapter " data-level="1.6.2" data-path="getters.html"> <a href="getters.html"> Accesseurs </a> </li> <li class="chapter " data-level="1.6.3" data-path="mutations.html"> <a href="mutations.html"> Mutations </a> </li> <li class="chapter " data-level="1.6.4" data-path="actions.html"> <a href="actions.html"> Actions </a> </li> <li class="chapter " data-level="1.6.5" data-path="modules.html"> <a href="modules.html"> Modules </a> </li> </ul> </li> <li class="chapter " data-level="1.7" data-path="structure.html"> <a href="structure.html"> Structure d'une application </a> </li> <li class="chapter " data-level="1.8" data-path="plugins.html"> <a href="plugins.html"> Plugins </a> </li> <li class="chapter " data-level="1.9" data-path="strict.html"> <a href="strict.html"> Mode strict </a> </li> <li class="chapter " data-level="1.10" data-path="forms.html"> <a href="forms.html"> Gestion des formulaires </a> </li> <li class="chapter " data-level="1.11" data-path="testing.html"> <a href="testing.html"> Tests </a> </li> <li class="chapter " data-level="1.12" data-path="hot-reload.html"> <a href="hot-reload.html"> Rechargement à chaud </a> </li> <li class="chapter " data-level="1.13" data-path="api.html"> <a href="api.html"> Documentation de l'API </a> </li> <li class="divider"></li> <li> <a href="https://www.gitbook.com" target="blank" class="gitbook-link"> Publié avec GitBook </a> </li> </ul> </nav> </div> <div class="book-body"> <div class="body-inner"> <div class="book-header" role="navigation"> <!-- Title --> <h1> <i class="fa fa-circle-o-notch fa-spin"></i> <a href="." >Vuex, qu'est-ce que c'est ?</a> </h1> </div> <div class="page-wrapper" tabindex="-1" role="main"> <div class="page-inner"> <div id="book-search-results"> <div class="search-noresults"> <section class="normal markdown-section"> <h1 id="vuex-quest-ce-que-cest-">Vuex, qu&apos;est-ce que c&apos;est ?</h1> <p>Vuex est un <strong><em>gestionnaire d&apos;&#xE9;tat (&#xAB; state management pattern &#xBB;)</em> et une biblioth&#xE8;que</strong> pour des applications Vue.js. Il sert de zone de stockage de donn&#xE9;es centralis&#xE9;e pour tous les composants dans une application, avec des r&#xE8;gles pour s&apos;assurer que l&apos;&#xE9;tat ne puisse subir de mutations que d&apos;une mani&#xE8;re pr&#xE9;visible. Il s&apos;int&#xE8;gre &#xE9;galement avec <a href="https://github.com/vuejs/vue-devtools" target="_blank">l&apos;extension officielle</a> de Vue afin de fournir des fonctionnalit&#xE9;s avanc&#xE9;es comme de la visualisation d&apos;&#xE9;tat dans le temps et des exports et imports d&#x2019;instantan&#xE9;s (&#xAB; snapshot &#xBB;) d&apos;&#xE9;tat.</p> <h3 id="un-&#xAB;-gestionnaire-d&#xE9;tat-&#xBB;-quest-ce-que-cest-">Un &#xAB; gestionnaire d&apos;&#xE9;tat &#xBB;, qu&apos;est-ce que c&apos;est ?</h3> <p>Commen&#xE7;ons par une simple application de comptage avec Vue :</p> <pre class="language-"><code class="lang-js"><span class="token keyword">new</span> <span class="token class-name">Vue</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// &#xE9;tat</span> data <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">{</span> count<span class="token punctuation">:</span> <span class="token number">0</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token comment" spellcheck="true">// vue</span> template<span class="token punctuation">:</span> <span class="token template-string"><span class="token string">` &lt;div&gt;{{ count }}&lt;/div&gt; `</span></span><span class="token punctuation">,</span> <span class="token comment" spellcheck="true">// actions</span> methods<span class="token punctuation">:</span> <span class="token punctuation">{</span> increment <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>count<span class="token operator">++</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> </code></pre> <p>C&apos;est une application autosuffisante avec les parties suivantes :</p> <ul> <li>L&apos;<strong>&#xE9;tat</strong>, qui est la source de v&#xE9;rit&#xE9; qui pilote votre application,</li> <li>La <strong>vue</strong>, qui est une r&#xE9;flexion d&#xE9;clarative de l&apos;<strong>&#xE9;tat</strong>,</li> <li>Les <strong>actions</strong>, qui sont les fa&#xE7;ons possibles pour l&apos;&#xE9;tat de changer en r&#xE9;action aux actions utilisateurs depuis la <strong>vue</strong>.</li> </ul> <p>Voici une repr&#xE9;sentation extr&#xEA;mement simple du concept de &#xAB; flux de donn&#xE9;e unidirectionnel &#xBB; :</p> <p style="text-align: center; margin: 2em"> <img style="width:100%;max-width:450px;" src="images/flow.png"> </p> <p>Cependant, la simplicit&#xE9; s&apos;&#xE9;vapore rapidement lorsque nous avons <strong>de multiples composants qui partagent un m&#xEA;me &#xE9;tat global</strong> :</p> <ul> <li>Plusieurs vues peuvent d&#xE9;pendre de la m&#xEA;me partie de l&apos;&#xE9;tat global.</li> <li>Des actions dans diff&#xE9;rentes vues peuvent avoir besoin de muter la m&#xEA;me partie de l&apos;&#xE9;tat global.</li> </ul> <p>Pour le premier probl&#xE8;me, passer des props peut &#xEA;tre fastidieux pour les composants profond&#xE9;ment imbriqu&#xE9;s, et &#xE7;a ne fonctionne tout simplement pas pour les composants d&apos;un m&#xEA;me parent. Pour le deuxi&#xE8;me probl&#xE8;me, on se retrouve souvent &#xE0; se rabattre sur des solutions telles qu&apos;acc&#xE9;der aux r&#xE9;f&#xE9;rences d&apos;instance du parent/enfant direct ou essayer de muter et synchroniser de multiples copies de l&apos;&#xE9;tat via des &#xE9;v&#xE8;nements. Ces deux mod&#xE8;les sont fragiles et posent rapidement des probl&#xE8;mes de maintenabilit&#xE9; du code.</p> <p>Alors pourquoi ne pas extraire l&apos;&#xE9;tat global partag&#xE9; des composants, et le g&#xE9;rer dans un singleton global ? De cette mani&#xE8;re, notre arbre de composant devient une grosse &#xAB; vue &#xBB;, et n&apos;importe quel composant peut acc&#xE9;der &#xE0; l&apos;&#xE9;tat global ou d&#xE9;clencher des actions, peu importe o&#xF9; il se trouve dans l&apos;arbre !</p> <p>De plus, en d&#xE9;finissant et en s&#xE9;parant les concepts impliqu&#xE9;s dans la gestion de l&apos;&#xE9;tat global et en appliquant certaines r&#xE8;gles, on donne aussi une structure et une maintenabilit&#xE9; &#xE0; notre code.</p> <p>Voil&#xE0; l&apos;id&#xE9;e de base derri&#xE8;re Vuex, inspir&#xE9; par <a href="https://facebook.github.io/flux/docs/overview.html" target="_blank">Flux</a>, <a href="http://redux.js.org/" target="_blank">Redux</a> et <a href="https://guide.elm-lang.org/architecture/" target="_blank">l&apos;architecture Elm</a>. &#xC0; l&apos;inverse des autres mod&#xE8;les, Vuex est aussi une biblioth&#xE8;que d&apos;impl&#xE9;mentation con&#xE7;ue sp&#xE9;cialement pour Vue.js afin de b&#xE9;n&#xE9;ficier de son syst&#xE8;me de r&#xE9;activit&#xE9; granulaire pour des modifications efficaces.</p> <p><img src="images/vuex.png" alt="vuex"></p> <h3 id="quand-lutiliser-">Quand l&apos;utiliser ?</h3> <p>Bien que Vuex nous aide &#xE0; g&#xE9;rer un &#xE9;tat global partag&#xE9;, il apporte aussi le cout de nouveaux concepts et <em>abstraction de code</em> (&#xAB; boilerplate &#xBB;). C&apos;est un compromis entre la productivit&#xE9; &#xE0; court terme et &#xE0; long terme.</p> <p>Si vous n&apos;avez jamais cr&#xE9;&#xE9; une <em>application monopage</em> &#xE0; grande &#xE9;chelle et que vous sautez directement dans Vuex, cela peut paraitre verbeux et intimidant. C&apos;est parfaitement normal ; si votre application est simple, vous vous en sortirez sans doute tr&#xE8;s bien sans Vuex. Un simple <a href="https://fr.vuejs.org/v2/guide/components.html#Communication-non-parent-enfant" target="_blank">canal d&apos;&#xE9;v&#xE8;nement global</a> pourrait tr&#xE8;s bien vous suffire. Mais si vous devez cr&#xE9;er une application monopage &#xE0; moyenne ou grande &#xE9;chelle, il y a des chances que vous vous trouviez dans des situations qui vous feront vous interroger sur une meilleure gestion de l&apos;&#xE9;tat global, d&#xE9;tach&#xE9; de votre composant Vue, et Vuex sera naturellement la prochaine &#xE9;tape pour vous. Voici une bonne citation de Dan Abramov, l&apos;auteur de Redux :</p> <blockquote> <p>&#xAB; Les librairies Flux, c&apos;est comme les lunettes : vous saurez quand vous en aurez besoin. &#xBB;</p> </blockquote> </section> </div> <div class="search-results"> <div class="has-results"> <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1> <ul class="search-results-list"></ul> </div> <div class="no-results"> <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1> </div> </div> </div> </div> </div> <script src="//m.servedby-buysellads.com/monetization.js" type="text/javascript"></script> <div class="bsa-cpc"></div> <script> (function(){ if(typeof _bsa !== 'undefined' && _bsa) { _bsa.init('default', 'CKYD62QM', 'placement:vuejsorg', { target: '.bsa-cpc', align: 'horizontal', disable_css: 'true' }); } })(); </script> </div> <a href="installation.html" class="navigation navigation-prev " aria-label="Previous page: Installation"> <i class="fa fa-angle-left"></i> </a> <a href="getting-started.html" class="navigation navigation-next " aria-label="Next page: Pour commencer"> <i class="fa fa-angle-right"></i> </a> </div> <script> var gitbook = gitbook || []; gitbook.push(function() { gitbook.page.hasChanged({"page":{"title":"Vuex, qu'est-ce que c'est ?","level":"1.4","depth":1,"next":{"title":"Pour commencer","level":"1.5","depth":1,"path":"getting-started.md","ref":"getting-started.md","articles":[]},"previous":{"title":"Installation","level":"1.3","depth":1,"path":"installation.md","ref":"installation.md","articles":[]},"dir":"ltr"},"config":{"plugins":["edit-link","prism","-highlight","github","-highlight","github"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"prism":{},"github":{"url":"https://github.com/vuejs/vuex/"},"livereload":{},"search":{},"theme-vuejs":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":false,"twitter":false,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"edit-link":{"label":"Éditer cette page","base":"https://github.com/vuejs/vuex/tree/dev/docs"},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"Vuex","language":"fr","links":{"sharing":{"facebook":false,"twitter":false}},"gitbook":"2.x.x"},"file":{"path":"intro.md","mtime":"2018-02-17T07:20:49.000Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2018-03-02T20:43:43.208Z"},"basePath":".","book":{"language":"fr"}}); }); </script> </div> <script src="../gitbook/gitbook.js"></script> <script src="../gitbook/theme.js"></script> <script src="../gitbook/gitbook-plugin-edit-link/plugin.js"></script> <script src="../gitbook/gitbook-plugin-github/plugin.js"></script> <script src="../gitbook/gitbook-plugin-livereload/plugin.js"></script> <script src="../gitbook/gitbook-plugin-search/search-engine.js"></script> <script src="../gitbook/gitbook-plugin-search/search.js"></script> <script src="../gitbook/gitbook-plugin-lunr/lunr.min.js"></script> <script src="../gitbook/gitbook-plugin-lunr/search-lunr.js"></script> <script src="../gitbook/gitbook-plugin-sharing/buttons.js"></script> </body> </html>