getState у redux-сазі?


76

У мене є магазин зі списком товарів. Коли моя програма вперше завантажується, мені потрібно десериалізувати елементи, як при створенні деяких об’єктів у пам’яті на основі елементів. Елементи зберігаються в моєму магазині 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.


чому ви хочете прочитати дані з магазину? ви не можете просто передати дані в корисному навантаженні дії?
gpilotino

Відповіді:


211

Ви можете використовувати ефект вибору

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' });
}

-6

Ефект Select не допомагає нам, якщо ми використовуємо функції зворотного виклику, коли 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) ...


Це здається більше схожим на анти-шаблон. Сага Redux вже є проміжним програмним забезпеченням і не повинна потребувати чогось цього клубового. Що таке функція зворотного виклику, яка не обробляється сагою? Як передача чогось В сагу допомагає тому, що не обробляється сагою?
Єгуда Макаров

Я не згоден. yield select()застосовується лише в контексті саги. Тільки. Saga може залучати деякі функції, інші бібліотеки із взаємодією користувачів за допомогою зворотних викликів. На той час, коли зворотний виклик спрацював - сага може взагалі не бути присутньою. Це спосіб використання магазину, коли Saga вийшов. (наприклад, інтерфейсні мікросервіси, веб-компонентний підхід з декількома магазинами, сага, реакція тощо)
Алекс Шварц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.