2017-04-18 1 views
4

비슷한 질문이 전에 제기되었지만 답변이 저에게 도움이되지 않았습니다. redux saga 선택기, 어떻게 사가에서 상태에 액세스합니까?

How to get something from the state/store inside a redux-saga function?

What are selectors in redux?

나는 내 무용담에서 상태에 액세스 할 수없는 것 때문에 내가 다른 설정을 가지고 있다고 생각합니다.

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

을하지만, 내가 말했듯이, 모두 statestore은 정의되지 않습니다.

그렇다면 사가에서 내 스토어 (또는 주)에 어떻게 액세스합니까?

답변

8

선택기를 사용해야합니다. 나는 간단한 예를 들어 줄 것이다. 아래 그림과 같이 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); 
} 

상수 usernamesampleSaga에서 이제 상태에서 사용자 이름 값을 보유하게됩니다.

+0

내가 말했듯이, 상태는 정의되지 않은 반환 : ( – Winter

+0

사실 내가 그것을 잘못 디버깅했다. 전체'yield select (selectors.username);을 사용했을 때 그것은 효과적이었다 - 마술처럼 :) – Winter

관련 문제