【问题标题】:redux saga selectors, how do I access state from a saga?redux saga 选择器,如何从 saga 访问状态?
【发布时间】:2017-09-14 12:17:17
【问题描述】:

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

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

那么,我如何在 saga 中访问我的商店(或状态)?

【问题讨论】:

    标签: reactjs react-redux redux-saga


    【解决方案1】:

    看起来事情可能发生了一些变化。不确定,redux-saga 文档并没有帮助我。可能是我的商店的设置方式。但如果你被困在 2021 年,这可能会有所帮助:

    我有一个具有属性“currentUser”的状态,而该状态又具有属性“id”。我需要身份证。

    const getUser = (state) => state.get('currentUser')
    
    function* addItem() {
        const currentUser = yield select(getUser)
        const id = currentUser.get('id')
        debugger
    }
    
    function* itemQuantitySaga() {
        yield all([takeLatest(INCREASE_ITEM_QUANTITY, addItem)])
    }
    
    
    

    【讨论】:

    • 您是否从该文件的某处导入状态?
    • 它是 redux-saga 中间件,将状态作为参数传递。
    【解决方案2】:

    您必须为此使用选择器。我举一个简单的例子。 创建文件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 现在将保存状态中的用户名值。

    【讨论】:

    • 我试过了,但就像我说的,状态返回 undefined :(
    • 确实有效!我调试错了。当我使用整个 yield select(selectors.username); 时,它起作用了——就像魔法一样 :)
    • 这太棒了。谢谢!
    • 我可以将状态封装在函数中,比如`function getUserName(params) { const username = yield select(selectors.username);返回用户名; } `
    • @ruandao 可以,如果 getUserName 是生成器函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多