redux saga 选择器,如何从 saga 访问状态?
Posted
技术标签:
【中文标题】redux saga 选择器,如何从 saga 访问状态?【英文标题】:redux saga selectors, how do I access state from a 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);
但就像我说的,state
和 store
都是未定义的。
那么,我如何在 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 是生成器函数。以上是关于redux saga 选择器,如何从 saga 访问状态?的主要内容,如果未能解决你的问题,请参考以下文章
从 Redux-Saga 函数更新另一个 Redux 存储的最佳方法