2016-07-27 21 views
6

Ich benutze redux-saga. Im Code yield* ReduxSaga.takeEvery('MY_ACTION', updatePorts); wie kann ich auf die action zugreifen, um seine Felder zu erhalten.Wie bekomme ich action.params aus saga

Zum Beispiel habe ich eine Aktion Schöpfer:

function status(){ 
    type: 'MY_ACTION', 
    status: true 
} 

Wie kann ich action.status aus meiner Saga? Oder muss ich nur über getState() und select auf Daten zugreifen?

Antwort

17
const actionCreator=()=>({ 
    type: 'MY_ACTION', 
    status:true 
}) 

function* updatePorts(action) { 
    console.log(action.status) 
} 

function* watchUpdatePorts() { 
    yield* takeEvery('MY_ACTION', updatePorts) 
} 

https://github.com/redux-saga/redux-saga/tree/master/docs/api#takeeverypattern-saga-args

+2

Sie sind genial. Es funktioniert. Können Sie bitte einen Link zur Dokumentation veröffentlichen? Ich könnte es gefunden haben. – zatziky

+0

Für mich arbeiten. Super Kumpel! – digit

2
const actionCreator =() => ({ 
    type: 'MY_ACTION', 
    status: true 
}) 

function* updatePorts() { 
    while (true) { 
     const { status } = take('MY_ACTION'); 
     // ... 
    } 

} 

könnten Sie tun, auch so etwas wie dieses. Die Redux-Saga-Dokumente haben eine schöne Erklärung zu den Vorteilen:

Die Verwendung von Take hat einen subtilen Einfluss darauf, wie wir unseren Code schreiben. Im Falle von takeEvery haben die aufgerufenen Aufgaben keine Kontrolle darüber, wann sie aufgerufen werden. Sie werden bei jeder passenden Aktion immer wieder aufgerufen. Sie haben auch keine Kontrolle darüber, wann sie die Beobachtung stoppen sollen.

Im Falle der Übernahme wird die Steuerung invertiert. Anstatt die Aktionen zu den Handler-Tasks zu schieben, zieht die Saga die Aktion selbst durch . Es sieht so aus, als ob die Saga einen normalen Funktionsaufruf action = getNextAction() ausführt, der aufgelöst wird, wenn die Aktion ausgelöst wird.

lesen Sie hier mehr: https://redux-saga.js.org/docs/advanced/FutureActions.html