2016-07-14 16 views
13

Załóżmy, że mam Link, który przesyła mnie do strony w celu dodania/edycji wpisu na liście.Jak wysłać akcję po kliknięciu linku podczas korzystania z React-Router i Redux?

Jak wysłać akcję Redux, gdy klikam na samym Link, aby najpierw zaktualizować sklep Redux, zanim zostanie on przekierowany na tę stronę.

Np .: Klikam na przycisk Edytuj -> Akcja jest wysyłana -> Zapisz zaktualizowany, {'state': 'edit-mode'} -> Przejdź do przekierowania.

A może masz inny sposób na wykonanie tego, co próbuję zrobić?

Może po zamontowaniu podzespołu wykonam akcję podobną do stateToEdit na podstawie określonych warunków? Jeśli tak, to pokaż mi swoją drogę. Dzięki

PS: Używam tylko jednego komponentu do wszystkich operacji dodawania/edycji/usuwania. Więc myślę o sposób, aby uczynić na podstawie state czy jej na edit-mode lub delete-mode itp

+4

Zamiast używać 'Link', możesz użyć' browserHistory.push (path) 'z funkcją' onClick'. Wewnątrz tej funkcji wyślij swoją akcję, a następnie popchnij do nowej lokalizacji. – lux

+0

Myślałem też o czymś takim, ale nie jestem zbyt pewny, czy to jest właściwy sposób rozwiązania problemu. Chyba użyję tej metody na razie. Jeśli są inne sposoby, chciałbym to wiedzieć. Dzięki –

+1

Bardziej odpowiednim sposobem rozwiązania tego problemu może być wprowadzenie 'redux-thunk', które prawdopodobnie pomoże w organizacji kodu nieco więcej, biorąc pod uwagę, że prawdopodobnie chcesz wykonać to" wyślij coś, a następnie przejdź do innej strony "w różnych miejscach .Rzuć okiem na odpowiedź Dana tutaj, jestem pewien, że dostanę przekładni, aby dowiedzieć się, w jaki sposób możesz podejść do problemu w twoim kontekście: http://stackoverflow.com/questions/35493352/can-i-dispatch-multiple- actions-without-redux-thunk-middleware/35642783 # 35642783 – lux

Odpowiedz

12

Oto kilka sposobów, można iść o rozwiązanie tego problemu:

  1. Zamiast Link, spróbuj użyć funkcji browserHistory.push(path) z funkcją onClick.
    • Wewnątrz onClick można dispatch swoje działanie, a następnie push do nowej lokalizacji.
    • Jeśli jednak chcesz wykonać tę serię czynności w różnych komponentach, prawdopodobnie będziesz cierpieć z powodu duplikacji kodu.
  2. Bardziej wytrzymałe sposobem rozwiązania tego problemu byłoby wdrożyć redux-thunk, który zapewnia ogólny sposób wykonywania wielu „działania” (może to być wywołanie działania Redux lub wykonywania operacji asynchronicznej, lub obu!) W odpowiedź na zmianę.
    • Dan ma świetną odpowiedź tutaj podkreślając prostotę co redux-thunk faktycznie oferuje: Can I dispatch multiple actions without Redux Thunk middleware?
    • W twoim przypadku, w funkcji incrementTwice, wyobraź sobie tylko zastąpienie jednego z połączeń dispatch(increment) z wezwaniem do browserHistory.push(action.path), podobnie jak poniżej:

Redux pomyślał działania

export const dispatchThenRoute = (myAction, myPath) => { 
    return (dispatch) => { 
     dispatch(myAction) 
     browserHistory.push(myPath); 
    } 
}; 
+0

Link Prefetch nie działa, jeśli zastosujemy to podejście. Mam rację? Lub jak sprawić, by działało! – myDoggyWritesCode