2016-07-14 92 views
13

Diciamo che ho uno Link che mi invia a una pagina per aggiungere/modificare una voce di elenco.Come inviare un'azione quando si fa clic su Link quando si utilizza React-Router & Redux?

Come faccio a inviare un'azione Redux quando faccio clic sullo stesso Link in modo da poter aggiornare prima il negozio Redux, prima di essere effettivamente reindirizzato a quella pagina.

Esempio: Faccio clic sul pulsante Modifica -> L'azione viene inviata -> Store aggiornato, {'state': 'edit-mode'} -> Procedere al reindirizzamento.

O hai in mente un altro modo per realizzare ciò che sto cercando di fare?

Forse quando il componente è montato, eseguirò un'azione come stateToEdit in base a determinate condizioni? Se è così, per favore mostrami la tua strada. Grazie

PS: Sto usando solo un componente per tutti aggiungere/modificare/eliminare. Così sto pensando a un modo per render basato sulla state se la sua sulla edit-mode o delete-mode ecc

+4

Invece di usare 'Link', è possibile utilizzare' browserHistory.push (path) 'con la funzione' onClick'. All'interno di questa funzione, invia la tua azione, quindi passa alla nuova posizione. – lux

+0

Pensavo anche a qualcosa del genere ma non sono sicuro se questo sia il modo giusto per risolvere il problema. Immagino che userò questo metodo per ora. Se ci sono altri modi, allora mi piacerebbe sapere. Grazie –

+1

Un modo più appropriato per risolvere questo problema potrebbe essere quello di introdurre "redux-thunk" che probabilmente contribuirebbe a organizzare il codice un po 'di più considerando che probabilmente si vuole eseguire questa azione "invia qualcosa, poi spostati su un'altra pagina" in vari luoghi .Dai un'occhiata alla risposta di Dan qui, sono sicuro che cambierà il modo in cui potresti affrontare il problema nel tuo contesto: http://stackoverflow.com/questions/35493352/can-i-dispatch-multiple- actions-without-redux-thunk-middleware/35642783 # 35642783 – lux

risposta

12

Qui ci sono un paio di modi si può andare su affrontare questo problema:

  1. Invece di usare Link, prova utilizzando browserHistory.push(path) con una funzione onClick.
    • All'interno del onClick, è possibile dispatch la vostra azione, poi push in una nuova posizione.
    • Tuttavia, se si desidera eseguire questa serie di azioni in vari componenti, si avrà probabilmente la duplicazione del codice.
  2. Un modo più robusto per affrontare questo problema sarebbe quello di implementare redux-thunk, che fornisce un modo generico di eseguire più "azioni" (sia esso chiamare un'azione Redux, o l'esecuzione di un'operazione asincrona, o entrambi!) In risposta a un cambiamento.
    • Dan ha una grande risposta qui mettendo in evidenza la semplicità di ciò redux-thunk offre in realtà: Can I dispatch multiple actions without Redux Thunk middleware?
    • Nel tuo caso, nella funzione incrementTwice, immaginate solo sostituendo una delle dispatch(increment) chiamate con una chiamata a browserHistory.push(action.path), simile a quello qui di seguito:

Redux thunk azione

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

Link Prefetch non funzionerà se seguiamo questo approccio. Ho ragione? O come farlo funzionare! – myDoggyWritesCode