Skip to content

Commit f495ad6

Browse files
committed
Translation part 6 b in french line 306
1 parent ad43d8c commit f495ad6

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed

src/content/6/fr/part6b.md

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,123 @@ const reducer = combineReducers({
186186
})
187187
```
188188

189+
L'état du store défini par le reducer ci-dessus est un objet avec deux propriétés: <i>notes</i> et <i>filter</i>. La valeur de la propriété <i>notes</i> est définie par le <i>noteReducer</i>, qui n'a pas à gérer les autres propriétés de l'état. De même, la propriété <i>filter</i> est gérée par le <i>filterReducer</i>.
190+
191+
Avant de faire plus de changements dans le code, examinons comment différentes actions changent l'état du store défini par le reducer combiné. Ajoutons ce qui suit au fichier <i>main.jsx</i>:
192+
193+
```js
194+
import { createNote } from './reducers/noteReducer'
195+
import { filterChange } from './reducers/filterReducer'
196+
//...
197+
store.subscribe(() => console.log(store.getState()))
198+
store.dispatch(filterChange('IMPORTANT'))
199+
store.dispatch(createNote('combineReducers forms one reducer from many simple reducers'))
200+
```
201+
202+
En simulant la création d'une note et en changeant l'état du filtre de cette manière, l'état du store est enregistré dans la console après chaque changement effectué dans le store:
203+
204+
![sortie console devtools montrant le filtre de notes et la nouvelle note](../../images/6/5e.png)
205+
206+
À ce stade, il est bon de prendre conscience d'un petit mais important détail. Si nous ajoutons une instruction de log console <i>au début des deux reducers</i>:
207+
208+
```js
209+
const filterReducer = (state = 'ALL', action) => {
210+
console.log('ACTION: ', action)
211+
// ...
212+
}
213+
```
214+
215+
D'après la sortie console, on pourrait avoir l'impression que chaque action est dupliquée:
216+
217+
![sortie console devtools montrant des actions dupliquées dans les reducers de note et de filtre](../../images/6/6.png)
218+
219+
Y a-t-il un bug dans notre code ? Non. Le reducer combiné fonctionne de telle manière que chaque <i>action</i> est gérée dans <i>chaque</i> partie du reducer combiné. Typiquement, un seul reducer est intéressé par une action donnée, mais il y a des situations où plusieurs reducers changent leurs parties respectives de l'état basées sur la même action.
220+
221+
### Finaliser les filtres
222+
223+
Terminons l'application de sorte qu'elle utilise le reducer combiné. Nous commençons par changer le rendu de l'application et en connectant le store à l'application dans le fichier <i>main.jsx</i>:
224+
225+
```js
226+
ReactDOM.createRoot(document.getElementById('root')).render(
227+
<Provider store={store}>
228+
<App />
229+
</Provider>
230+
)
231+
```
232+
233+
Ensuite, corrigeons un bug causé par le code qui s'attend à ce que le store de l'application soit un tableau de notes:
234+
235+
![TypeError dans le navigateur: notes.map n'est pas une fonction](../../images/6/7v.png)
236+
237+
C'est une correction facile. Étant donné que les notes se trouvent dans le champ <i>notes</i> du store, nous devons juste apporter un petit changement à la fonction de sélection:
238+
239+
```js
240+
const Notes = () => {
241+
const dispatch = useDispatch()
242+
const notes = useSelector(state => state.notes) // highlight-line
243+
244+
return(
245+
<ul>
246+
{notes.map(note =>
247+
<Note
248+
key={note.id}
249+
note={note}
250+
handleClick={() =>
251+
dispatch(toggleImportanceOf(note.id))
252+
}
253+
/>
254+
)}
255+
</ul>
256+
)
257+
}
258+
```
259+
260+
Auparavant, la fonction sélecteur retournait l'intégralité de l'état du store:
261+
262+
```js
263+
const notes = useSelector(state => state)
264+
```
265+
266+
Et maintenant, elle retourne seulement son champ <i>notes</i>
267+
268+
```js
269+
const notes = useSelector(state => state.notes)
270+
```
271+
272+
Extrayons le filtre de visibilité dans son propre composant <i>src/components/VisibilityFilter.jsx</i> :
273+
274+
```js
275+
import { filterChange } from '../reducers/filterReducer'
276+
import { useDispatch } from 'react-redux'
277+
278+
const VisibilityFilter = (props) => {
279+
const dispatch = useDispatch()
280+
281+
return (
282+
<div>
283+
all
284+
<input
285+
type="radio"
286+
name="filter"
287+
onChange={() => dispatch(filterChange('ALL'))}
288+
/>
289+
important
290+
<input
291+
type="radio"
292+
name="filter"
293+
onChange={() => dispatch(filterChange('IMPORTANT'))}
294+
/>
295+
nonimportant
296+
<input
297+
type="radio"
298+
name="filter"
299+
onChange={() => dispatch(filterChange('NONIMPORTANT'))}
300+
/>
301+
</div>
302+
)
303+
}
304+
305+
export default VisibilityFilter
306+
```
307+
189308
</div>

0 commit comments

Comments
 (0)