getState в redux-saga?
у меня есть магазин со списком товаров. Когда мое приложение загружается впервые, мне нужно десериализовать элементы, как в создании некоторых объектов в памяти на основе элементов. Элементы хранятся в моем магазине redux и обрабатываются itemsReducer
.
Я пытаюсь использовать redux-saga для обработки десериализации в качестве побочного эффекта. При загрузке первой страницы я отправляю действие:
dispatch( deserializeItems() );
моя сага настроена просто:
function* deserialize( action ) {
// How to getState here??
yield put({ type: 'DESERISLIZE_COMPLETE' });
}
function* mySaga() {
yield* takeEvery( 'DESERIALIZE', deserialize );
}
в моей саге десериализации, где я чтобы справиться с побочным эффектом создания версий в памяти моих элементов, мне нужно прочитать существующие данные из магазина. Я не уверен, как это сделать здесь, или если это шаблон, который я должен даже пытаться с redux-saga.
2 ответов
можно использовать Выберите эффект
import {select, ...} from 'redux-saga/effects'
function* deserialize( action ) {
const state = yield select();
....
yield put({ type: 'DESERISLIZE_COMPLETE' });
}
также вы можете использовать его с селекторами
const getItems = state => state.items;
function* deserialize( action ) {
const items = yield select(getItems);
....
yield put({ type: 'DESERISLIZE_COMPLETE' });
}
Select effect не помогает нам, если мы в функции обратного вызова, когда поток кода не обрабатывается Saga. В этом случае просто пас dispatch
и getState
для root saga:
store.runSaga(rootSaga, store.dispatch, store.getState)
и параметры передачи в дочерние саги
export default function* root(dispatch, getState) {
yield all([
fork(loginFlow, dispatch, getState),
])
}
а потом в watch methods
export default function* watchSomething(dispatch, getState)
...