2017-04-18 35 views
4

以前也有類似的問題,但答案對我沒有任何幫助。REDX傳奇選擇器,我如何從傳奇進入狀態?

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

不斷usernamesampleSaga現在將保持來自狀態的用戶名值。

+0

我試過了,但就像我說的,狀態返回undefined :( – Winter

+0

其實它工作!我調試它錯了。當我使用整個'yield select(selectors.username);'它工作 - 像魔術:) – Winter