我想把我的头围在redux和sagas上,我认为我设置了错误,希望有人可以提供一些见识。
我已经以初始状态创建了自己的商店,并调度了一个操作,如下所示:
const initialState = fromJS({
product: {},
basket: {},
global: {}
});
const reducers = combineReducers({ product, basket, global });
const sagaMiddleware = createSagaMiddleware();
const store = createStore(reducers,
initialState,
applyMiddleware(sagaMiddleware))
initSagas(sagaMiddleware);
store.dispatch(retrieveSiteKeyValues())
return store;
};
Combine Reducers来自redux-immutable。
我的传奇功能:
export function* fetchSiteKeyValuesSaga() {
yield take(RETRIEVE_SITE_KEY_VALUES)
const siteKeyValues = yield call(retrieveSiteKeyValues)
yield put(storeSiteKeyValues(siteKeyValues));
}
我的减速器功能:
const storeSiteKeyValues = (state, payload) => {
payload.anotherObject = {};
payload.anotherMap = new Map();
const newState = fromJS({ payload })
return newState
// OR return state.merge({ global: { siteKey: action.siteKey } }); ?
}
当我询问状态对象时,size
为零。由于我的initalState,我希望大小至少为3。当newState
被创建时,大小为4。但是当它回到状态切换语句中时,状态大小又为零:
export default (state, action) => {
switch (action.type) {
case STORE_SITE_KEY_VALUES : {
return storeSiteKeyValues (state, action.payload);
}
default:
return state;
}
}
我90%的人确定只是像我在化简器函数中所做的那样转储状态是错误的,所以我应该使用set()
或setIn()
,我认为update()
会更有意义,但是当我使用这些方法时,如果我尝试在控制台中制定.get(x)
,则状态始终为空或“未定义”。
当我在浏览器中检查状态时,它看起来像这样:
storeState:{
[2],
[2]
[2]
}
展开的数组如下所示:
0:"product"
1:{anotherObject :{}, anotherMap: map()
size:1
我希望作为有效载荷一部分的值不仅在这里是新的object
和map
。
我在创建商店时错误地确定了我的状态吗?我是否以错误的方式进行redux和状态管理?
答案 0 :(得分:0)
我想确保您没有错过基本内容:sagaMiddleware.run(YOUR_SAGA);
通话在哪里?是否隐藏在initSagas
内?
答案 1 :(得分:0)
这是两次设置我的初始状态,一次是在初始化商店时,另一次是在读取reducer初始状态时。我在减速器中的状态是一个空对象,就像在减速器“激活”时那样。最后,我意识到我没有从任何地方读取某些“记忆”状态,我只需要一些初始值即可。我进入了reducer并从我的应用程序中删除了不可变的js,因为这很令人困惑。
为所有新手提供的一些经验教训/ redux-saga!不要试图使事情复杂化。了解什么是一成不变的!自己找出是否需要它,在我的情况下,只有一个真理来源和进入国家就足够了。
进一步阅读: Initalising State, Immutable and State considerations