Я пытаюсь обернуть голову вокруг Redux или управления состоянием в целом для интерфейсных приложений.
Насколько я знаю, есть три базовых c библиотеки для создания сложных действий logi c: redux-thunk
, redux-saga
и redux-observable
.
Я использую redux-thunk
для создания цепочки асинхронных c операций, но я нашел их немного неуместными: Создатели действий должны создавать действия, а не функции.
Чтобы обойти это, я создал действия (создатели простых действий) и операции (thunks) с redux-toolkit
, но я все еще вижу их немного сбивает с толку:
- редукторы. js (они также представляют действия):
export function add(state, action) { ... }
export function added(state, action) { ... }
- операции. js (они выполняют сложные действия logi c):
export function addItem(payload) {
return async (dispatch) => {
dispatch(actions.add(payload))
const { data } = await Items.create(action.payload);
dispatch(actions.added(payload))
}
}
Выглядит нормально, но я вижу себя пытающимся отправить add
непосредственно в будущем.
Использование redux-saga
кажется неестественным благодаря синтаксису генератора. Мне не нужно ничего говорить о redux-observable
, это слишком сложно для этой простой задачи.
Поэтому я попытался использовать простое пользовательское промежуточное ПО для такой работы, но я не знаю, действительно ли это «хорошая практика» или «плохая практика». Однако он позволяет использовать простые действия для запуска наблюдателя, который отправляет функцию сопоставления:
- middlewares / обозреватель. js (упрощенно):
let listeners = {}
export const observer = store => next => action => {
const result = next(action)
if (action.type in listeners) {
listeners[action.type](store.dispatch, action)
}
return result
}
export const createListener = (action, listener) => {
listeners[action.type] = listener
}
Код выше позволяет писать «наблюдатели» / «слушатели», как показано ниже:
createListener(actions.add, async (dispatch, action) => {
const { data } = await Items.create(action.payload)
dispatch(actions.added(data))
})
..., который позволяет отправлять обратный вызов, прикрепленный к прослушиваемым действиям. Выглядит очень просто и чисто для меня.
Это плохой способ решить эту проблему?