#reactjs #redux
#reactjs #redux
Вопрос:
Я использовал redux toolkit. Что меня смутило в createReducer, так это то, что я не совсем понимаю разницу между .addCase и .addMatcher?
Ответ №1:
addCase
запустит редуктор, если поле отправленного действияaction.type
точно соответствует строке, которую вы предоставляетеaddMatcher
запустит редуктор, если функция обратного вызова, которую вы предоставляете, возвращаетtrue
, и вам решать, как работает соответствующее поведение. Обычно это делается путем проверки того, является лиaction.type
поле частичным совпадением, напримерreturn action.type.endsWith("/pending")
Ответ №2:
Чтобы добавить больше ясности в популярные объяснения: builder.addCase
может рассматриваться как сокращение для builder.addMatcher
, где действие сопоставляется его type
свойству. Итак, следующие две части кода функционально эквивалентны:
1.
export default createReducer(initialState, (builder) => {
builder
.addCase(actions.openModal, (state, { payload }) => ({ ...state, modalData: payload, isModalOpen: true }))
.addCase(actions.closeModal, (state) => ({ ...state, isModalOpen: false }));
});
export default createReducer(initialState, (builder) => {
builder
.addMatcher(
({ type }) => type === actions.openModal.type,
(state, { payload }) => ({ ...state, modalData: payload, isModalOpen: true })
)
.addMatcher(
({ type }) => type === actions.closeModal.type,
(state) => ({ ...state, isModalOpen: false })
);
});