La gestion d'état est l'un des défis majeurs du développement d'applications React modernes. Redux Toolkit, évolution officielle de Redux, simplifie considérablement cette tâche en proposant une approche plus intuitive et moins verbeuse. Dans cet article, nous allons explorer en détail comment utiliser Redux Toolkit pour gérer efficacement l'état de vos applications frontend.
Les fondamentaux de Redux Toolkit
Redux Toolkit (RTK) est construit sur les principes fondamentaux de Redux tout en réduisant significativement le "boilerplate code". Il introduit plusieurs concepts clés :
- configureStore : Configuration simplifiée du store avec des middlewares par défaut
- createSlice : Création de reducers et actions en une seule fonction
- createAsyncThunk : Gestion simplifiée des actions asynchrones
Installation et configuration de base
// Installation via npm
npm install @reduxjs/toolkit react-redux
// store.js
import { configureStore } from '@reduxjs/toolkit'
const store = configureStore({
reducer: {}
})
export default store
Création d'un slice avec Redux Toolkit
// features/counter/counterSlice.js
import { createSlice } from '@reduxjs/toolkit'
const counterSlice = createSlice({
name: 'counter',
initialState: {
value: 0
},
reducers: {
increment: (state) => {
state.value += 1
},
decrement: (state) => {
state.value -= 1
}
}
})
export const { increment, decrement } = counterSlice.actions
export default counterSlice.reducer
Intégration avec React
// App.js
import { Provider } from 'react-redux'
import store from './store'
function App() {
return (
)
}
// Counter.js
import { useSelector, useDispatch } from 'react-redux'
import { increment, decrement } from './counterSlice'
function Counter() {
const count = useSelector((state) => state.counter.value)
const dispatch = useDispatch()
return (
{count}
)
}
Gestion des appels API avec createAsyncThunk
// features/users/usersSlice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'
export const fetchUsers = createAsyncThunk(
'users/fetchUsers',
async () => {
const response = await fetch('https://api.example.com/users')
return response.json()
}
)
const usersSlice = createSlice({
name: 'users',
initialState: {
data: [],
status: 'idle',
error: null
},
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchUsers.pending, (state) => {
state.status = 'loading'
})
.addCase(fetchUsers.fulfilled, (state, action) => {
state.status = 'succeeded'
state.data = action.payload
})
.addCase(fetchUsers.rejected, (state, action) => {
state.status = 'failed'
state.error = action.error.message
})
}
})
Bonnes pratiques et optimisations
- Utilisez RTK Query pour la gestion du cache et des requêtes API
- Structurez vos slices par fonctionnalité
- Évitez la duplication d'état
- Utilisez les sélecteurs memoïsés avec createSelector
// Exemple de sélecteur memoïsé
import { createSelector } from '@reduxjs/toolkit'
const selectUsers = (state) => state.users.data
const selectFilter = (state) => state.users.filter
export const selectFilteredUsers = createSelector(
[selectUsers, selectFilter],
(users, filter) => users.filter(user =>
user.name.toLowerCase().includes(filter.toLowerCase())
)
)
Tests unitaires
// counterSlice.test.js
import reducer, { increment, decrement } from './counterSlice'
test('should handle initial state', () => {
expect(reducer(undefined, { type: 'unknown' })).toEqual({
value: 0
})
})
test('should handle increment', () => {
const previousState = { value: 0 }
expect(reducer(previousState, increment())).toEqual({
value: 1
})
})
Performance et debugging
Redux Toolkit inclut par défaut le Redux DevTools Extension, permettant un debugging avancé :
- Inspection de l'état en temps réel
- Time-travel debugging
- Action replay
- État exportable/importable
Conclusion
Redux Toolkit simplifie considérablement la gestion d'état dans les applications React tout en conservant la puissance et la flexibilité de Redux. Ses fonctionnalités comme createSlice et createAsyncThunk réduisent la complexité du code tout en améliorant la maintenabilité. Pour les développeurs .NET habitués aux patterns de conception robustes, RTK offre une approche familière et structurée de la gestion d'état côté frontend.
Points clés à retenir :
- Configuration simplifiée avec configureStore
- Réduction du boilerplate avec createSlice
- Gestion efficace des appels API avec createAsyncThunk
- Outils de debugging puissants
- Excellent support pour les tests unitaires