Skip to content
This repository was archived by the owner on Sep 3, 2024. It is now read-only.

Commit 4aa8ae4

Browse files
committed
Translate Guide/Vuex-store
1 parent 9be3909 commit 4aa8ae4

File tree

1 file changed

+189
-0
lines changed

1 file changed

+189
-0
lines changed

Diff for: fr/guide/vuex-store.md

+189
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
---
2+
title: Vuex Store
3+
description: L'utilisation d'un store pour gérer l'état est important pour toutes les applications de taille importante, c'est pourquoi nuxt.js met en œuvre Vuex dans son cœur.
4+
---
5+
6+
> L'utilisation d'un store pour gérer l'état est important pour toutes les applications de taille importante, c'est pourquoi nuxt.js met en œuvre [vuex](https://github.com/vuejs/vuex) dans son cœur.
7+
8+
## Activer le Store
9+
10+
Nuxt.js recherchera le répertoire `store`; si il existe il:
11+
12+
1. Importera Vuex
13+
2. Ajoutera le module `vuex` dans le vendors bundle
14+
3. Ajoutera l'option `store` à l'instance racine de `Vue`.
15+
16+
Nuxt.js vous laisse le choix entre **2 modes de store**, choisissez celui qui vous convient le mieux:
17+
- **Classique:** `store/index.js` retourne une instance
18+
- **Modules:** chaque fichier `.js` dans le répertoire `store` est transformé en tant que [module avec son propre espace de nom](http://vuex.vuejs.org/en/modules.html) (`index` étant le module racine)
19+
20+
## Mode classique
21+
22+
Pour activer le store avec le mode classique, nous créons `store/index.js` dans lequel nous exportons l'instance du store:
23+
24+
```js
25+
import Vuex from 'vuex'
26+
27+
const store = new Vuex.Store({
28+
state: {
29+
counter: 0
30+
},
31+
mutations: {
32+
increment (state) {
33+
state.counter++
34+
}
35+
}
36+
})
37+
38+
export default store
39+
```
40+
41+
> Pas besoin d'installer `vuex` étant livré avec nuxt.js
42+
43+
Nous pouvons alors utiliser `this.$store` dans nos composants:
44+
45+
```html
46+
<template>
47+
<button @click="$store.commit('increment')">{{ $store.state.counter }}</button>
48+
</template>
49+
```
50+
51+
## Mode modules
52+
53+
> Nuxt.js vous permet d'avoir un répertoire `store` dans lequel chaque fichier correspond à un module.
54+
55+
Si vous voulez cette option, exportez le `state`, les mutations et les actions dans `store/index.js` au lieu de l'instance `store`:
56+
57+
```js
58+
export const state = {
59+
counter: 0
60+
}
61+
62+
export const mutations = {
63+
increment (state) {
64+
state.counter++
65+
}
66+
}
67+
```
68+
69+
Puis, vous pouvez avoir `store/todos.js`:
70+
```js
71+
export const state = {
72+
list: []
73+
}
74+
75+
export const mutations = {
76+
add (state, text) {
77+
state.list.push({
78+
text: text,
79+
done: false
80+
})
81+
},
82+
delete (state, { todo }) {
83+
state.list.splice(state.list.indexOf(todo), 1)
84+
},
85+
toggle (state, todo) {
86+
todo.done = !todo.done
87+
}
88+
}
89+
```
90+
91+
Le store sera comme suit:
92+
```js
93+
new Vuex.Store({
94+
state: { counter: 0 },
95+
mutations: {
96+
increment (state) {
97+
state.counter++
98+
}
99+
},
100+
modules: {
101+
todos: {
102+
state: {
103+
list: []
104+
},
105+
mutations: {
106+
add (state, { text }) {
107+
state.list.push({
108+
text,
109+
done: false
110+
})
111+
},
112+
delete (state, { todo }) {
113+
state.list.splice(state.list.indexOf(todo), 1)
114+
},
115+
toggle (state, { todo }) {
116+
todo.done = !todo.done
117+
}
118+
}
119+
}
120+
}
121+
})
122+
```
123+
124+
Et dans votre `pages/todos.vue`, utiliser le module `todos`:
125+
126+
```html
127+
<template>
128+
<ul>
129+
<li v-for="todo in todos">
130+
<input type="checkbox" :checked="todo.done" @change="toggle(todo)">
131+
<span :class="{ done: todo.done }">{{ todo.text }}</span>
132+
</li>
133+
<li><input placeholder="What needs to be done?" @keyup.enter="addTodo"></li>
134+
</ul>
135+
</template>
136+
137+
<script>
138+
import { mapMutations } from 'vuex'
139+
140+
export default {
141+
computed: {
142+
todos () { return this.$store.state.todos.list }
143+
},
144+
methods: {
145+
addTodo (e) {
146+
this.$store.commit('todos/add', e.target.value)
147+
e.target.value = ''
148+
},
149+
...mapMutations({
150+
toggle: 'todos/toggle'
151+
})
152+
}
153+
}
154+
</script>
155+
156+
<style>
157+
.done {
158+
text-decoration: line-through;
159+
}
160+
</style>
161+
```
162+
163+
<div class="Alert">Vous pouvez également avoir des modules en exportant une instance store; vous devrez les ajouter manuellement sur votre store.
164+
165+
## La méthode fetch
166+
167+
> La méthode fetch est utilisée pour remplir le store avant de faire le rendu de la page, c'est comme la méthode data sauf qu'elle ne définit pas les données du composant.
168+
169+
Plus d'informations à propos de la méthode fetch: [API Pages fetch](/api/pages-fetch)
170+
171+
## L'action nuxtServerInit
172+
173+
Si l'action `nuxtServerInit` est définie dans le store, nuxt.js l'appellera avec le contexte (uniquement côté serveur). C'est utile lorsque nous disposons de données sur le serveur que nous voulons donner directement au client.
174+
175+
Par exemple, disons que nous avons des sessions côté serveur et nous pouvons accéder à l'utilisateur connecté grâce à `req.session.user`. Pour donner l'utilisateur authentifié à notre store, nous mettons à jour notre `store/index.js` comme suit:
176+
177+
```js
178+
actions: {
179+
nuxtServerInit ({ commit }, { req }) {
180+
if (req.session.user) {
181+
commit('user', req.session.user)
182+
}
183+
}
184+
}
185+
```
186+
187+
> Si vous utilisez le mode _Modules_ du store Vuex, seul le module principal (dans `store/index.js`) recevra cette action. Vous devrez chainer vos actions de module à partir de là.
188+
189+
Le contexte est fourni par `nuxtServerInit` comme 2ème argument. C'est le même que pour les méthodes `data` et `fetch` excepté que `context.redirect()` et `context.error()` sont omis.

0 commit comments

Comments
 (0)