it-swarm.com.ru

getState в редукс-саге?

У меня есть магазин со списком предметов. Когда мое приложение загружается впервые, мне нужно десериализовать элементы, как при создании некоторых объектов в памяти на основе этих элементов. Предметы хранятся в моем магазине и хранятся в itemsReducer.

Я пытаюсь использовать redux-saga для обработки десериализации, как побочный эффект. При первой загрузке страницы я отправляю действие:

dispatch( deserializeItems() );

Моя сага настроена просто:

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

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

В моей саге о десериализации, где я хочу справиться с побочным эффектом создания версий своих элементов в памяти, мне нужно прочитать существующие данные из хранилища. Я не уверен, как это сделать здесь, или, если это шаблон, который я должен даже попытаться с Redx-сага.

46
Andy Ray

вы можете использовать выбрать эффект

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

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

также вы можете использовать его с селекторами

const getItems = state => state.items;

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

Эффект выбора не помогает нам, если мы в функциях обратного вызова, когда поток кода не обрабатывается Saga. В этом случае просто передайте 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) ...

0
Alex Shwarc