redux saga 选择器,如何从 saga 访问状态?
redux saga selectors, how do I access state from a saga?
之前也有人问过类似的问题,但是答案对我没有任何帮助。
我认为我有一个不同的设置,因为我似乎无法从我的传奇中访问状态。
我试过:
const getList = store => store;
const getList = state=> state;
这两个 return 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 中访问我的商店(或状态)?
为此您必须使用 selectors。我举一个简单的例子。
创建一个文件 selectors.js
并从您的商店中添加您想要 select 的字段,如下所示。
export const username = (state) => state.user.name;
然后在您的传奇中,将 select 导入为,
import * as selectors from './selectors';
当你在 saga 中需要 username
时,你可以简单地做,
import {select} from 'redux-saga/effects';
...
...
function *sampleSaga(params) {
const username = yield select(selectors.username);
}
sampleSaga
中的常量 username
现在将保存状态中的用户名值。
看起来情况可能发生了一些变化。不确定,redux-saga 文档没有帮助我。可能是我商店的设置方式。但如果你被困在 2021 年,这可能会有所帮助:
我有一个 属性 'currentUser' 的状态,而 属性 'id' 又是一个状态。我需要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)])
}
之前也有人问过类似的问题,但是答案对我没有任何帮助。
我认为我有一个不同的设置,因为我似乎无法从我的传奇中访问状态。
我试过:
const getList = store => store;
const getList = state=> state;
这两个 return 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 中访问我的商店(或状态)?
为此您必须使用 selectors。我举一个简单的例子。
创建一个文件 selectors.js
并从您的商店中添加您想要 select 的字段,如下所示。
export const username = (state) => state.user.name;
然后在您的传奇中,将 select 导入为,
import * as selectors from './selectors';
当你在 saga 中需要 username
时,你可以简单地做,
import {select} from 'redux-saga/effects';
...
...
function *sampleSaga(params) {
const username = yield select(selectors.username);
}
sampleSaga
中的常量 username
现在将保存状态中的用户名值。
看起来情况可能发生了一些变化。不确定,redux-saga 文档没有帮助我。可能是我商店的设置方式。但如果你被困在 2021 年,这可能会有所帮助:
我有一个 属性 'currentUser' 的状态,而 属性 'id' 又是一个状态。我需要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)])
}