getState в редукс-саге?
У меня есть магазин со списком предметов. Когда мое приложение сначала загружается, мне нужно десериализовать элементы, как в создании некоторых объектов в памяти на основе элементов. Элементы хранятся в моем магазине itemsReducer
и обрабатываются itemsReducer
.
Я пытаюсь использовать саунд-сагу для обработки десериализации, как побочный эффект. При загрузке первой страницы я отправляю действие:
dispatch( deserializeItems() );
Моя сага настроена просто:
function* deserialize( action ) {
// How to getState here??
yield put({ type: 'DESERISLIZE_COMPLETE' });
}
function* mySaga() {
yield* takeEvery( 'DESERIALIZE', deserialize );
}
В моей садисе deserialize, где я хочу обработать побочный эффект создания версий памяти в моих памяти, мне нужно прочитать существующие данные из магазина. Я не уверен, как это сделать здесь, или если это шаблон, я должен даже пытаться с саунд-редукцией.
Ответы
Ответ 1
вы можете использовать эффект выбора
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' });
}
Ответ 2
Эффект Select не помогает нам, если мы выполняем функции обратного вызова, когда Saga не обрабатывает поток кода. В этом случае просто getState
dispatch
и getState
в корневую сагу:
store.runSaga(rootSaga, store.dispatch, store.getState)
И параметры прохождения для детских саг
export default function* root(dispatch, getState) { yield all([ fork(loginFlow, dispatch, getState), ]) }
А затем в виде часов
export default function* watchSomething(dispatch, getState)...