redux saga 选择器,如何从 saga 访问状态?

IT技术 reactjs react-redux redux-saga
2021-04-28 17:01:42

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

redux 中的选择器是什么?

如何从 redux-saga 函数中的 state/store 获取一些东西?

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

我试着做:

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不确定。

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

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

常量usernameinsampleSaga现在将保存来自状态的用户名值。

看起来事情可能发生了一些变化。不确定,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)])
}