Как мы знаем, createStore — это основная функция библиотеки Redux, которая позволяет разработчикам создавать хранилище, которое является центральным местом хранения состояния приложения. Он предоставляет простой, но мощный способ управления состоянием и позволяет отправлять действия для обновления состояния предсказуемым образом. Эта функция принимает функцию редуктора, необязательное начальное состояние и необязательный расширитель, что позволяет разработчикам настраивать поведение хранилища. Функция createStore формирует основу архитектуры Redux, обеспечивая однонаправленный поток данных и обеспечивая эффективное обновление и изменение состояния в сложных приложениях.
Реализация нашей функции createStore.
const createStore = (reducer) => {
let currentState = reducer(undefined, {});
return {
getState: () => {
return currentState;
},
dispatch: (action) => {
currentState = reducer(currentState, action);
},
};
};
combineReducers — это служебная функция, предоставляемая библиотекой Redux, которая упрощает управление несколькими редукторами в приложении Redux. В более крупных приложениях часто встречается разделение состояния и действий на несколько меньших функций-редюсеров, каждая из которых отвечает за управление определенной частью общего состояния приложения. Однако функция combineReducers объединяет эти отдельные функции редуктора в один согласованный редуктор, который можно передать в хранилище Redux.
Реализация нашей функции combineReducers
const combineReducers = (reducers) => {
return (state = {}, action) => {
let newState = {};
for (let key in reducers) {
newState[key] = reducers[key](state[key], action);
}
return newState;
};
};
Определение наших констант действий
const actions = {
ACTION1: "ACTION1",
ACTION2: "ACTION2",
};
Определение нашего первого редьюсера
const initialState1 = {
value: 10,
};
const reducer1 = (state = initialState1, action) => {
const currVal = state.value;
switch (action.type) {
case actions.ACTION1:
return { ...state, value: currVal + action.payload.value };
case actions.ACTION2:
return { ...state, value: currVal - action.payload.value };
default:
return state;
}
};
Определение нашего второго редьюсера
const initialState2 = {
value: 5,
};
const reducer2 = (state = initialState2, action) => {
const currVal = state.value;
switch (action.type) {
case actions.ACTION1:
return { ...state, value: currVal + action.payload.value };
case actions.ACTION2:
return { ...state, value: currVal - action.payload.value };
default:
return state;
}
};
Объединение наших редукторов с помощью функции combineReducers, созданной выше.
const reducer = combineReducers({ red1: reducer1, red2: reducer2 });
Создание магазина
const store = createStore(reducer);
Определение наших действий
const action1 = {
type: actions.ACTION1,
payload: {
value: 2,
},
};
const action2 = {
type: actions.ACTION2,
payload: {
value: 1,
},
};
Тестирование нашего кода для различных сценариев.
console.log(store.getState()); store.dispatch(action1); console.log(store.getState()); store.dispatch(action2); console.log(store.getState());
Вывод
{ red1: { value: 10 }, red2: { value: 5 } }
{ red1: { value: 12 }, red2: { value: 7 } }
{ red1: { value: 11 }, red2: { value: 6 } }
Ура, это работает!!!
Спасибо, что дочитали до конца. Пожалуйста, подумайте о том, чтобы подписаться на автора и эту публикацию. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.