123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576 |
- <!DOCTYPE HTML>
- <html lang="fr" >
- <head>
- <meta charset="UTF-8">
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <title>Plugins · Vuex</title>
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
- <meta name="description" content="">
- <meta name="generator" content="GitBook 3.2.2">
-
-
-
-
- <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="strict.html" />
-
-
- <link rel="prev" href="structure.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 " 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 active" 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="." >Plugins</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="plugins">Plugins</h1>
- <p>Les stores Vuex prennent une option <code>plugins</code> qui expose des hooks pour chaque mutation. Un plugin Vuex est simplement une fonction qui reçoit un store comme unique argument :</p>
- <pre class="language-"><code class="lang-js"><span class="token keyword">const</span> myPlugin <span class="token operator">=</span> store <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token comment" spellcheck="true">// appelé quand le store est initialisé</span>
- store<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token punctuation">(</span>mutation<span class="token punctuation">,</span> state<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token comment" spellcheck="true">// appelé après chaque mutation.</span>
- <span class="token comment" spellcheck="true">// Les mutations arrivent au format `{ type, payload }`.</span>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- <span class="token punctuation">}</span>
- </code></pre>
- <p>Et peut être utilisé ainsi :</p>
- <pre class="language-"><code class="lang-js"><span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
- <span class="token comment" spellcheck="true">// ...</span>
- plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span>myPlugin<span class="token punctuation">]</span>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- </code></pre>
- <h3 id="acter-des-mutations-dans-des-plugins">Acter des mutations dans des plugins</h3>
- <p>Les plugins ne sont pas autorisés à muter directement l'état. Tout comme vos composants, ils peuvent simplement déclencher des changements en actant des mutations.</p>
- <p>En actant des mutations, un plugin peut être utilisé pour synchroniser la source de données avec le store. Par exemple, pour synchroniser la source de données d'une websocket vers le store (c'est juste un exemple artificiel, en réalité la fonction <code>createPlugin</code> peut prendre des options additionnelles pour des tâches plus complexes) :</p>
- <pre class="language-"><code class="lang-js"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> createWebSocketPlugin <span class="token punctuation">(</span>socket<span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token keyword">return</span> store <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- socket<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'data'</span><span class="token punctuation">,</span> data <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- store<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token string">'receiveData'</span><span class="token punctuation">,</span> data<span class="token punctuation">)</span>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- store<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span>mutation <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token keyword">if</span> <span class="token punctuation">(</span>mutation<span class="token punctuation">.</span>type <span class="token operator">===</span> <span class="token string">'UPDATE_DATA'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
- socket<span class="token punctuation">.</span><span class="token function">emit</span><span class="token punctuation">(</span><span class="token string">'update'</span><span class="token punctuation">,</span> mutation<span class="token punctuation">.</span>payload<span class="token punctuation">)</span>
- <span class="token punctuation">}</span>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- <span class="token punctuation">}</span>
- <span class="token punctuation">}</span>
- </code></pre>
- <pre class="language-"><code class="lang-js"><span class="token keyword">const</span> plugin <span class="token operator">=</span> <span class="token function">createWebSocketPlugin</span><span class="token punctuation">(</span>socket<span class="token punctuation">)</span>
- <span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
- state<span class="token punctuation">,</span>
- mutations<span class="token punctuation">,</span>
- plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span>plugin<span class="token punctuation">]</span>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- </code></pre>
- <h3 id="prendre-des-instantanés-de-létat">Prendre des instantanés de l'état</h3>
- <p>Parfois un plugin peut vouloir recevoir des « instantanés » de l'état, et également comparer l'état post mutation avec l'état prémutation. Pour faire ceci, vous aurez besoin d'effectuer une copie complète de l'état :</p>
- <pre class="language-"><code class="lang-js"><span class="token keyword">const</span> myPluginWithSnapshot <span class="token operator">=</span> store <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token keyword">let</span> prevState <span class="token operator">=</span> _<span class="token punctuation">.</span><span class="token function">cloneDeep</span><span class="token punctuation">(</span>store<span class="token punctuation">.</span>state<span class="token punctuation">)</span>
- store<span class="token punctuation">.</span><span class="token function">subscribe</span><span class="token punctuation">(</span><span class="token punctuation">(</span>mutation<span class="token punctuation">,</span> state<span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>
- <span class="token keyword">let</span> nextState <span class="token operator">=</span> _<span class="token punctuation">.</span><span class="token function">cloneDeep</span><span class="token punctuation">(</span>state<span class="token punctuation">)</span>
- <span class="token comment" spellcheck="true">// comparer `prevState` et `nextState`...</span>
- <span class="token comment" spellcheck="true">// sauver l'état pour la prochaine mutation</span>
- prevState <span class="token operator">=</span> nextState
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- <span class="token punctuation">}</span>
- </code></pre>
- <p><strong>Les plugins qui peuvent prendre des instantanés ne devraient être utilisés que pendant le développement.</strong> Lorsqu'on utilise webpack ou Browserify, on peut laisser nos outils de développement (« devtools ») s'occuper de ça pour nous :</p>
- <pre class="language-"><code class="lang-js"><span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
- <span class="token comment" spellcheck="true">// ...</span>
- plugins<span class="token punctuation">:</span> process<span class="token punctuation">.</span>env<span class="token punctuation">.</span>NODE_ENV <span class="token operator">!==</span> <span class="token string">'production'</span>
- <span class="token operator">?</span> <span class="token punctuation">[</span>myPluginWithSnapshot<span class="token punctuation">]</span>
- <span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- </code></pre>
- <p>Le plugin sera utilisé par défaut. Pour la production, vous aurez besoin de <a href="https://webpack.js.org/plugins/define-plugin/" target="_blank">DefinePlugin</a> pour webpack ou de <a href="https://github.com/hughsk/envify" target="_blank">envify</a> pour Browserify pour convertir la valeur de <code>process.env.NODE_ENV !== 'production'</code> à <code>false</code> pour le build final.</p>
- <h3 id="plugin-de-logs-intégré">Plugin de logs intégré</h3>
- <blockquote>
- <p>Si vous utilisez <a href="https://github.com/vuejs/vue-devtools" target="_blank">vue-devtools</a> vous n'avez probablement pas besoin de ça.</p>
- </blockquote>
- <p>Vuex fournit un plugin de logs à des fins de débogage :</p>
- <pre class="language-"><code class="lang-js"><span class="token keyword">import</span> createLogger <span class="token keyword">from</span> <span class="token string">'vuex/dist/logger'</span>
- <span class="token keyword">const</span> store <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Vuex<span class="token punctuation">.</span>Store</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
- plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token function">createLogger</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">]</span>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- </code></pre>
- <p>La fonction <code>createLogger</code> prend quelques options :</p>
- <pre class="language-"><code class="lang-js"><span class="token keyword">const</span> logger <span class="token operator">=</span> <span class="token function">createLogger</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
- collapsed<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token comment" spellcheck="true">// auto-expand logged mutations</span>
- filter <span class="token punctuation">(</span>mutation<span class="token punctuation">,</span> stateBefore<span class="token punctuation">,</span> stateAfter<span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token comment" spellcheck="true">// retourne `true` si une mutation devrait être logguée</span>
- <span class="token comment" spellcheck="true">// `mutation` est un `{ type, payload }`</span>
- <span class="token keyword">return</span> mutation<span class="token punctuation">.</span>type <span class="token operator">!==</span> <span class="token string">"aBlacklistedMutation"</span>
- <span class="token punctuation">}</span><span class="token punctuation">,</span>
- transformer <span class="token punctuation">(</span>state<span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token comment" spellcheck="true">// transforme l'état avant de le logguer.</span>
- <span class="token comment" spellcheck="true">// retourne par exemple seulement un sous-arbre spécifique</span>
- <span class="token keyword">return</span> state<span class="token punctuation">.</span>subTree
- <span class="token punctuation">}</span><span class="token punctuation">,</span>
- mutationTransformer <span class="token punctuation">(</span>mutation<span class="token punctuation">)</span> <span class="token punctuation">{</span>
- <span class="token comment" spellcheck="true">// les mutations sont logguées au format `{ type, payload }`</span>
- <span class="token comment" spellcheck="true">// nous pouvons les formater comme nous le souhaitons.</span>
- <span class="token keyword">return</span> mutation<span class="token punctuation">.</span>type
- <span class="token punctuation">}</span><span class="token punctuation">,</span>
- logger<span class="token punctuation">:</span> console<span class="token punctuation">,</span> <span class="token comment" spellcheck="true">// implementation de l'API `console`, par défaut `console`</span>
- <span class="token punctuation">}</span><span class="token punctuation">)</span>
- </code></pre>
- <p>Le fichier de logs peut aussi être inclus directement via une balise <code>script</code>, et exposera la fonction <code>createVuexLogger</code> globalement.</p>
- <p>Notez que le plugin de logs peut prendre des instantanés de l'état, ne l'utilisez donc que durant le développement.</p>
-
- </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="structure.html" class="navigation navigation-prev " aria-label="Previous page: Structure d'une application">
- <i class="fa fa-angle-left"></i>
- </a>
-
-
- <a href="strict.html" class="navigation navigation-next " aria-label="Next page: Mode strict">
- <i class="fa fa-angle-right"></i>
- </a>
-
-
-
- </div>
- <script>
- var gitbook = gitbook || [];
- gitbook.push(function() {
- gitbook.page.hasChanged({"page":{"title":"Plugins","level":"1.8","depth":1,"next":{"title":"Mode strict","level":"1.9","depth":1,"path":"strict.md","ref":"strict.md","articles":[]},"previous":{"title":"Structure d'une application","level":"1.7","depth":1,"path":"structure.md","ref":"structure.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":{"edit-link":{"label":"Éditer cette page","base":"https://github.com/vuejs/vuex/tree/dev/docs"},"github":{"url":"https://github.com/vuejs/vuex/"},"prism":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":false,"twitter":false,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-vuejs":{},"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":"plugins.md","mtime":"2018-04-20T00:44:03.860Z","type":"markdown"},"gitbook":{"version":"3.2.2","time":"2018-04-20T00:47:55.633Z"},"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-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>
|