Comment accéder à l'état redux dans une fonction de saga?
Réponse courte:
import { select } from 'redux-saga';
...
let data = yield select(stateSelectorFunction);
Comme @markerikson l'a déjà indiqué, redux-saga
expose une API très utile select()
pour appeler un selector
sur l'état afin d'en obtenir une partie disponible dans la saga.
Pour votre exemple, une implémentation simple pourrait être:
/*
* Selector. The query depends by the state shape
*/
export const getProject = (state) => state.project
// Saga
export function* saveProjectTask() {
while(true) {
yield take(SAVE_PROJECT);
let project = yield select(getProject); // <-- get the project
yield call(fetch, '/api/project', { body: project, method: 'PUT' });
yield put({type: SAVE_PROJECT_SUCCESS});
}
}
Outre le suggéré doc de @markerikson, il existe un très bon tutoriel vidéo de D. Abramov qui explique comment utiliser selectors
avec Redux. Vérifiez également this fil intéressant sur Twitter.
C'est à cela que servent les "sélecteurs". Vous leur transmettez l’arbre d’état entier et ils renvoient une partie de l’état. Le code qui appelle le sélecteur n'a pas besoin de savoir où dans l'état des données, mais simplement le fait qu'elles aient été renvoyées. Voir http://redux.js.org/docs/recipes/ComputingDerivedData.html pour quelques exemples.
Dans une saga, le select()
API peut être utilisé pour exécuter un sélecteur.