Czy mogę wysyłać wiele akcji bez Redux Thunk middleware?

Czytałem, że Redux Thunk jest niezawodnym sposobem zarządzania asynchronicznymi akcjami/żądaniami. Nie ma wiele o wysyłaniu działań przez inne działania.

A co z wysyłaniem akcji synchronicznych? Nie jestem pewien problemów z wydajnością thunk approach, ale czy mogę po prostu wysłać akcję wewnątrz innego kreatora akcji bez definiowania funkcji wewnątrz?

Wydaje mi się, że używanie redux thunk jest niepotrzebne do tej potrzeby.

Author: Dan Abramov, 2016-02-19

3 answers

Pokazywanie i ukrywanie powiadomień sprawia, żerzeczywiście wydaje się być dobrym przypadkiem użycia dla thunksa.

Odpowiedź Davida opisuje "domyślny" sposób wykonywania kilku aktualizacji w odpowiedzi na coś: obsługiwać je z różnych reduktorów. Najczęściej to jest to, co chcesz zrobić.

Czasami (jak w przypadku powiadomień) może to być niewygodne. Opisuję w moją odpowiedź na to pytanie Jak można wybrać pomiędzy wysłaniem jednej lub kilku akcji.

W przypadku kiedy wykonasz zdecydujesz się na wysłanie wielu akcji, zrób to sekwencyjnie ze swoich komponentów lub użyj Redux Thunk. Pamiętaj, że jeśli Redux Thunk wydaje ci się tajemniczy, powinieneś zrozumieć, czym naprawdę jest przed użyciem. Zapewnia tylko korzyści w zakresie organizacji kodu; w rzeczywistości nie różni się niczym od prowadzenia dispatch() dwa razy z rzędu samodzielnie.

To powiedziawszy, z Redux Thunk wysyłanie wielu akcji wygląda tak:

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

Za pomocą Redux Thunk nie będzie miał żadnych problemów z wydajnością. Jest to po prostu miły sposób wywoływania funkcji, do których możesz przekazać swój dispatch, aby mogły to robić tyle razy, ile chcą.

 33
Author: Dan Abramov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:17

Błędem jest myślenie o działaniach mających na celu określenie zmian jako jeden do jednego. Są one w rzeczywistości wiele do wielu. Pamiętaj, że wszystkie działania są wywoływane na wszystkich reduktorach.

Na przykład, pojedyncza akcja może wywołać kilka zmian stanu:

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

Odwrotnie, ta sama zmiana stanu może wynikać z dwóch różnych działań.

function firstReducer(state, action) {
    switch (action.type) {
        case ACTION_X:
        case ACTION_Y:
            // handle action x and y in the same manner
    }
}
To może wydawać się dziwne, aby obsługiwać dwa działania w ten sam sposób, ale jest to tylko w kontekście jednego reduktora. Inne reduktory są dowolne w obsłudze oni inaczej.
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
    }
}

Z tą relacją wiele do wielu, po prostu nie ma potrzeby posiadania hierarchii działań. Jeśli masz twórców akcji uruchamiających wiele akcji synchronicznych, Twój kod staje się bardziej złożony i trudniejszy do rozumowania.

 15
Author: David L. Walsh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 23:12:26

Jeśli to przejdzie, to tak, używając:

store.dispatch(action1, action2)

Może +1 na GitHubie?

 1
Author: Robert Plummer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-16 18:53:24