2017-04-18 4 views
4

類似の質問が以前に聞かれましたが、回答が私に何の助けにもなっていません。reduxサガセレクタ、どのように私はサガから州にアクセスするのですか?

What are selectors in redux?

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

私は佐賀から状態にアクセスできるように見えることはできませんので、私は別のセットアップを持っていると思います。

私がやってみました:

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

sampleSagaの定数username stateからのユーザ名の値を保持するようになりました。

+0

私はそれを試しましたが、状態は未定義です:( – Winter

+0

実際にはうまくいきました!間違ってデバッグしていたのですが、 'yield select(selectors.username); – Winter

関連する問題