Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs redux传奇选择器,如何从传奇中访问状态?_Reactjs_React Redux_Redux Saga - Fatal编程技术网

Reactjs redux传奇选择器,如何从传奇中访问状态?

Reactjs redux传奇选择器,如何从传奇中访问状态?,reactjs,react-redux,redux-saga,Reactjs,React Redux,Redux Saga,以前也有人问过类似的问题,但答案对我没有任何帮助 我认为我有一个不同的设置,因为我似乎无法从我的传奇中访问状态 我试着做: const getList = store => store; const getList = state=> state; 它们都返回未定义的 我的商店看起来像这样 export default function createStoreWithMiddleware() { const sagaMiddleware = createSagaMidd

以前也有人问过类似的问题,但答案对我没有任何帮助

我认为我有一个不同的设置,因为我似乎无法从我的传奇中访问状态

我试着做:

const getList = store => store;
const getList = state=> state;
它们都返回未定义的

我的商店看起来像这样

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
都是未定义的


那么,如何访问传奇中的存储(或状态)?

您必须使用选择器。我将给出一个简单的例子。 创建一个文件
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中的用户名值。

我试过了,但正如我所说,state返回undefined:(实际上它工作了!我调试错了。当我使用整个
时,产生selector(selectors.username);
它工作了-就像魔术一样:)这太棒了。非常感谢。我是否可以在函数中封装状态,如`function getUserName(params){const username=yield select(selectors.username);return username;}`@ruandao是的,如果getUserName是一个生成器函数,您可以。