селекторы redux saga, как получить доступ к состоянию из саги?
подобные вопросы задавались и раньше,но ответы не помогли мне.
как получить что-то от государства / магазина внутри функции 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
неопределены.
Итак, как мне получить доступ к моему магазину (или государству) в саге?
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
теперь будет содержать значение имени пользователя из состояния.