Селекторы саги redux, как мне получить доступ к состоянию из саги?

Подобные вопросы задавали и раньше, но ответы мне не помогли.

Что такое селекторы в redux?

Как получить что-то из состояние / сохранение внутри функции redux-saga?

Я думаю, что у меня другая установка, так как я не могу получить доступ к состоянию из моей саги.

Я пробовал делать:

const getList = store => store;
const getList = state=> state;

они оба возвращают undefined.

Мой магазин выглядит так ...

export default function createStoreWithMiddleware() {
    const sagaMiddleware = createSagaMiddleware();
    const loggerMiddleware = createLogger();
    const middleware = [sagaMiddleware, loggerMiddleware];
    const persistedState = localStorage.getItem('reduxState') ? JSON.parse(localStorage.getItem('reduxState')) : {};

    const store = createStore(reducer, persistedState, compose(
        applyMiddleware(...middleware)
    ));

    store.subscribe(() => {
        localStorage.setItem('reduxState', JSON.stringify(store.getState()));
    });

    sagaMiddleware.run(rootSaga);

    return store;
}

И я хочу получить доступ к моему списку в этой саге:

function* selectTender(action) {
    try {
        const response = yield Api.getTenderById(action.payload);
        yield put({type: 'SELECT_TENDER_SUCCEEDED', currentTender: response});
        const list = yield select(getList);
        yield put({type: 'FETCH_CHAPTERS', chaptersList: list, tenderId: response.id});
    } catch (err) {
        yield put({type: 'SELECT_TENDER_FAILED', message: err.message});
    }
}

export function* watchSelectTender(){
    yield takeEvery('SELECT_TENDER', selectTender);
}

Но, как я уже сказал, и state, и store не определены.

Итак, как мне получить доступ к моему магазину (или состоянию) в саге?


person Winter    schedule 18.04.2017    source источник


Ответы (1)


Для этого вам придется использовать селекторы. Приведу простой пример. Создайте файл selectors.js и добавьте поля, которые вы хотите выбрать в своем магазине, как показано ниже.

export const username = (state) => state.user.name;

Затем в своей саге импортируйте селекторы как,

import * as selectors from './selectors';

и когда вам потребуется username в своей саге, вы можете просто сделать,

import {select} from 'redux-saga/effects';
...
...
function *sampleSaga(params) {
   const username = yield select(selectors.username);
}

константа username в sampleSaga теперь будет содержать значение имени пользователя из состояния.

person Vishal Sharma    schedule 18.04.2017
comment
Я пробовал это, но, как я уже сказал, состояние возвращает undefined :( - person Winter; 19.04.2017
comment
На самом деле это сработало! Я неправильно его отлаживал. Когда я использовал весь yield select(selectors.username);, все заработало - как по волшебству :) - person Winter; 19.04.2017
comment
Это фантастика. Спасибо! - person JonnyBeoulve; 24.07.2018
comment
могу ли я инкапсулировать состояние в функции вроде `function getUserName (params) {const username = yield select (selectors.username); вернуть имя пользователя; } ` - person ruandao; 01.11.2019
comment
@ruandao: да, можно, если getUserName - это функция-генератор. - person Vishal Sharma; 18.11.2019
comment
Спасибо! Только не забудьте поставить yield перед _2 _... - person Filip Savic; 21.05.2021