Могу ли я отправлять несколько действий без промежуточного программного обеспечения Redux Thunk?

Я читал, что Redux Thunk - это надежный способ управления асинхронными действиями / запросами. Там нет ничего особенного в распределении действий другими действиями.

Как насчет отправки синхронных действий? Я не уверен в проблемах производительности подхода thunk, но могу ли я просто отправить действие внутри другого создателя действия, не определяя функцию внутри?

Мне кажется, что использование избыточного толчка не нужно для этой необходимости.

3 ответа

Решение

Отображение и сокрытие уведомлений, действительно, является хорошим вариантом использования для thunks.

В ответе Дэвида описан "стандартный" способ сделать несколько обновлений в ответ на что-то: обработать это из разных редукторов. Чаще всего это то, что вы хотите сделать.

Иногда (как с уведомлениями) это может быть неудобно. Я описываю, как вы можете выбирать между отправкой одного или нескольких действий в моем ответе на этот вопрос.

В случае, если вы решили отправить несколько действий, либо просто выполните это последовательно из ваших компонентов, либо используйте Redux Thunk. Обратите внимание, что если Redux Thunk кажется вам загадочным, вы должны понять, что это такое на самом деле, прежде чем использовать его. Это дает только преимущества с точки зрения организации кода; на самом деле это ничем не отличается от бега dispatch() два раза подряд сами.

Тем не менее, с Redux Thunk диспетчеризация нескольких действий выглядит следующим образом:

function increment() {
  return { type: 'INCREMENT' }
}

function incrementTwice() {
  return dispatch => {
    dispatch(increment())
    dispatch(increment())
  }
}

store.dispatch(increment())
incrementTwice()(store.dispatch) // doesn’t require redux-thunk but looks ugly
store.dispatch(incrementTwice()) // requires redux-thunk but looks nice

Использование Redux Thunk не будет иметь проблем с производительностью. Это просто хороший способ вызова функций, которым вы можете передать свои dispatch поэтому они могут делать это столько раз, сколько захотят.

Ошибочно думать о действиях, чтобы заявить об изменениях как один к одному. Они на самом деле многие ко многим. Помните, что все действия выполняются на всех редукторах.

Например, одно действие может вызвать несколько изменений состояния:

function firstReducer(state, action) {
    switch (action.type) {
        case ACTION_X:
            // handle action x
    }
}

function secondReducer(state, action) {
    switch (action.type) {
        case ACTION_X:
            // handle action x
    }
}

function thirdReducer(state, action) {
    switch (action.type) {
        case ACTION_X:
            // handle action x
    }
}

И наоборот, одно и то же изменение состояния может быть результатом двух разных действий.

function firstReducer(state, action) {
    switch (action.type) {
        case ACTION_X:
        case ACTION_Y:
            // handle action x and y in the same manner
    }
}

Может показаться странным обрабатывать два действия одинаково, но это только в контексте одного редуктора. Другие редукторы могут обращаться с ними по-другому.

function secondReducer(state, action) {
    switch (action.type) {
        case ACTION_X:
            // handle action x
        case ACTION_Y:
            // handle action y
    }
}

function thirdReducer(state, action) {
    switch (action.type) {
        case ACTION_X:
            // handle action x
        default:
            // ignore action y
    }
}

При таком соотношении "многие ко многим" просто не нужно иметь иерархию действий. Если у вас есть создатели действий, запускающие несколько синхронных действий, ваш код становится более сложным и сложным для размышления.

Если это проходит, тогда да, используя:

store.dispatch(action1, action2)

Может +1 на github?

Другие вопросы по тегам