getState in Redux-Saga?

75

Ich habe ein Geschäft mit einer Liste von Artikeln. Wenn meine App zum ersten Mal geladen wird, muss ich die Elemente deserialisieren, wie beim Erstellen einiger speicherinterner Objekte basierend auf den Elementen. Die Artikel werden in meinem Redux-Shop gespeichert und von einem itemsReducer.

Ich versuche, Redux-Saga als Nebeneffekt zu verwenden , um die Deserialisierung zu behandeln. Beim Laden der ersten Seite sende ich eine Aktion aus:

dispatch( deserializeItems() );

Meine Saga ist einfach aufgebaut:

function* deserialize( action ) {
    // How to getState here??
    yield put({ type: 'DESERISLIZE_COMPLETE' });
}

function* mySaga() {
    yield* takeEvery( 'DESERIALIZE', deserialize );
}

In meiner Deserialisierungssaga, in der ich den Nebeneffekt der Erstellung von In-Memory-Versionen meiner Artikel behandeln möchte, muss ich die vorhandenen Daten aus dem Speicher lesen. Ich bin mir nicht sicher, wie ich das hier machen soll, oder wenn das ein Muster ist, sollte ich es sogar mit Redux-Saga versuchen.

Andy Ray
quelle
Warum möchten Sie die Daten aus dem Geschäft lesen? Können Sie nicht einfach die Daten in der Aktionsnutzlast übergeben?
Gpilotino

Antworten:

207

Sie können den Auswahleffekt verwenden

import {select, ...} from 'redux-saga/effects'

function* deserialize( action ) {
    const state = yield select();
    ....
    yield put({ type: 'DESERIALIZE_COMPLETE' });
}

Sie können es auch mit Selektoren verwenden

const getItems = state => state.items;

function* deserialize( action ) {
    const items = yield select(getItems);
    ....
    yield put({ type: 'DESERIALIZE_COMPLETE' });
}
Kokovin Vladislav
quelle
-6

Der Auswahleffekt hilft uns nicht, wenn wir in einem Rückruf funktionieren, wenn der Codefluss nicht von Saga verarbeitet wird. In diesem Fall einfach weitergeben dispatchund getStatedie Saga verwurzeln:

store.runSaga(rootSaga, store.dispatch, store.getState)

Und die Übergabeparameter an Kindersagen

export default function* root(dispatch, getState) { yield all([ fork(loginFlow, dispatch, getState), ]) }

Und dann in Uhrenmethoden

export default function* watchSomething(dispatch, getState) ...

Alex Shwarc
quelle
Dies scheint eher ein Anti-Muster zu sein. Die Redux-Saga ist bereits Middleware und sollte nichts so Klobiges brauchen. Was ist eine Rückruffunktion, die von einer Saga nicht ausgeführt wird? Wie hilft es, etwas in die Saga zu geben, das nicht von der Saga behandelt wird?
Yehuda Makarov
Ich stimme nicht zu. yield select()ist nur im Saga-Kontext anwendbar. Nur. Saga kann einige Funktionen beinhalten, andere Bibliotheken mit Benutzerinteraktionen über Rückrufe. Zu diesem Zeitpunkt, als der Rückruf ausgelöst wurde, ist die Saga möglicherweise überhaupt nicht mehr vorhanden. Dies ist eine Möglichkeit, Store zu verwenden, wenn Saga nicht verfügbar ist. (Zum Beispiel Frontend-Microservices, Web-Komponenten-Ansatz mit mehreren Filialen, Saga, Reagieren usw.)
Alex Shwarc