39
loading...
This website collects cookies to deliver better user experience
Le 'state' de l'ensemble de votre application est stocké dans une arborescence d'objets au sein d'un seul 'store' qui agit comme la seule source de vérité pour votre application.
S'assurer que le 'state' est en lecture seule et nécessite des modifications en émettant une action descriptive.
Spécifie comment les 'state' sont transformé par les actions, vous écrivez des fonctions 'reducer' pures.
$ npm install @reduxjs/toolkit react-redux
$ npx create-react-app my-app --template redux
import { configureStore } from '@reduxjs/toolkit'
export default configureStore({
reducer: {},
})
import React from 'react'
import ReactDOM from 'react-dom'
import './index.css'
import App from './App'
import store from './app/store'
import { Provider } from 'react-redux'
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)
import { useSelector } from 'react-redux'
const items = useSelector(selectItems)
import { useDispatch } from 'react-redux'
import { addItemToBasket } from './basketSlice'
const dispatch = useDispatch()
return (
<button onClick={() => dispatch(addItemToBasket(item))}>Add</button>
)
import { createSlice } from '@reduxjs/toolkit';
const initialState = {
items: [
{id: 1, name: 'iPhone10'},
{id: 2, name: 'iPadPro'},
{id: 3, name: 'iWatch'},
]
};
let nextId = 4
export const basketSlice = createSlice({
name: 'basket',
initialState,
reducers: {
addItemToBasket: (state, action) => {
console.log('in')
state.items = [...state.items, {id: nextId, name: action.payload.name}]
nextId += 1
},
removeItemFromBasket: (state, action) => {
state.items = state.items.filter(item => item.id !== action.payload.id)
},
},
});
export const { addItemToBasket, removeItemFromBasket } = basketSlice.actions;
export const selectItems = (state) => state.basket.items;
export default basketSlice.reducer;
import { configureStore } from '@reduxjs/toolkit';
import basketReducer from '../features/basket/basketSlice';
export const store = configureStore({
reducer: {
basket: basketReducer,
},
});
Nous avons un store qui contient toutle state de notre application.
Nous créons notre app store dans : scr/app/store.js
Pour rendre ce store disponible pour vos components Nous ajoutons la balise Provider entre notre composant de niveau supérieur (App)
Pour récupérer ou muter les données du store, nous devons utiliser des selector et des reducer.
Les selector et les reducer sont regroupés par slice
Pour appeler un selector, nous utilisons le hook useSelector(). Par exemple : items = useSelector(basketItems)
Pour appeler l'action du reducer, nous utilisons le hook useDispatch(). Par exemple : dispatch(addItemToBasket(item))