Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Отображение и скрытие уведомлений делает действительно хорошим вариантом использования для 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, чтобы они могли делать это столько раз, сколько они хотят.

Ответ 2

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

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

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
    }
}

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

Ответ 3

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

store.dispatch(action1, action2)

Может быть +1 в github?