2017-04-18 48 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