Это старая версия документа!
Redux Toolkit - Керування стейтами (новий правильний варіант)
redux-toolkit це офіційна бібліотека для ефективної розробки з використанням Redux, яка призначена для стандартизації та спрощення написання логіки Redux.
Встановлення
Використовуючи Redux Toolkit, немає необхідності додавати в проект пакет redux, крім випадків, коли вам необхідна функція combineReducers(). Достатньо встановити @reduxjs/toolkit для написання логіки Redux та react-redux для зв'язку стора з компонентами.
npm install @reduxjs/toolkit
Створюємо структуру файлів (приклад)
- /сomponents/redux/
- store.jsx - сховище верхнього рівня що буде керувати усіма підлеглими
- contactsSlice.jsx - підлегле сховище що керує значенніми (стейтами) повязаними з контактами
- filtersSlice.jsx - підлегле сховище що керує стейтами повязаними з фільтрами
Конфігурація головного сховища
import { configureStore } from "@reduxjs/toolkit";
import { contactsReducer } from "./contactsSlice"; //Redux Toolkit - імпортуємо слайс контактів
import { filtersReducer } from "./filtersSlice"; //Redux Toolkit - імпортуємо слайс фільтрів
//persist - імопртуємо необхідні бібліотеки persist redux. З цим не розбирємось - просто копіюємо
import {
persistStore,
persistReducer,
FLUSH,
REHYDRATE,
PAUSE,
PERSIST,
PURGE,
REGISTER,
} from "redux-persist";
import storage from "redux-persist/lib/storage";
//persist
//persist - вказуємо які редюсери нам потрібно зберегти в локальному сховищі
const contactsPeristConfig = {
key: "contactsitems",
storage,
whitelist: ["items"], // зберігаємо лише властивість items з головного сховища у локальному сховищі (білий список)
};
//persist
//Redux Toolkit - єкспортуємо головне сховище store
export const store = configureStore({
reducer: {
contacts: persistReducer(contactsPeristConfig, contactsReducer), //redux-persist - додаємо до головного сховища збережені дані в локальному сховищі
filters: filtersReducer
},
//persist - конфігурація middleware для redux-persist. З цим не розбирємось - просто копіюємо
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({
serializableCheck: {
ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],
},
}),
//persist
});
//persist - єкспортуємо store з redux-persist
export const persistor = persistStore(store);
//persist
Створення одночасно редюсера и єкшена createSlice
Краще викорситовувати цей метод бо одночасно тсворить і редюсер і єкшен. Тут вже не треба притримуватись то іммутабельного принципу зміни бо усе одлно всередині він буде перетворений у іммутабельний
import { createSlice } from "@reduxjs/toolkit";
const tasksSlice = createSlice({
name: "tasks",
initialState: [],
reducers: {
addTask(state, action) {
state.push(action.payload);
},
deleteTask(state, action) {
const index = state.findIndex(task => task.id === action.payload);
state.splice(index, 1);
},
toggleCompleted(state, action) {
for (const task of state) {
if (task.id === action.payload) {
task.completed = !task.completed;
break;
}
}
},
},
});
const { addTask, deleteTask, toggleCompleted } = tasksSlice.actions;
const tasksReducer = tasksSlice.reducer;