web-dev-qa-db-fra.com

getState dans Redux-Saga?

J'ai un magasin avec une liste d'articles. Lorsque mon application est chargée pour la première fois, je dois désérialiser les éléments, comme pour créer des objets en mémoire à partir des éléments. Les articles sont stockés dans mon magasin Redux et gérés par un itemsReducer.

J'essaie d'utiliser redux-saga pour gérer la désérialisation, comme effet secondaire. Au chargement de la première page, je dépêche une action:

dispatch( deserializeItems() );

Ma saga est mise en place simplement:

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

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

Dans ma saga sur la désérialisation, où je veux gérer les effets secondaires de la création de versions en mémoire de mes articles, je dois lire les données existantes dans le magasin. Je ne suis pas sûr de savoir comment faire cela ici, ou si c'est un motif que je devrais même essayer avec Redux-saga.

46
Andy Ray

vous pouvez utiliser sélectionner l'effet

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

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

aussi vous pouvez l'utiliser avec des sélecteurs

const getItems = state => state.items;

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

L'effet de sélection ne nous aide pas si nous utilisons des fonctions de rappel, lorsque le flux de code n'est pas géré par Saga. Dans ce cas, passez simplement dispatch et getState à root saga:

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

Et les paramètres de passage aux enfants sagas

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

Et puis dans les méthodes de surveillance

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

0
Alex Shwarc