我正试图把我的大脑包裹在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;
};
组合缩减器来自redux-immutable。
我的saga函数:
export function* fetchSiteKeyValuesSaga() {
yield take(RETRIEVE_SITE_KEY_VALUES)
const siteKeyValues = yield call(retrieveSiteKeyValues)
yield put(storeSiteKeyValues(siteKeyValues));
}
我的reducer函数:
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%确定像我在reducer函数中所做的那样在状态上转储是错误的,我应该使用set()
或setIn()
我认为update()
会更有意义,但当我使用这些方法时,如果我试图在控制台中执行.get(x)
,状态总是为空或“未定义”。
当我在浏览器中检查状态时,它看起来如下所示:
storeState:{
[2],
[2]
[2]
}
展开的数组如下所示:
0:"product"
1:{anotherObject :{}, anotherMap: map()
size:1
我希望作为有效负载一部分的值在这里,而不仅仅是新的object
和map
。
我是否在创建商店时错误地初始化了我的状态?我是否以错误的方式处理redux和状态管理?
发布于 2019-01-28 14:20:29
我想确保您没有遗漏一个基本部分:sagaMiddleware.run(YOUR_SAGA);
调用在哪里?它是否隐藏在initSagas
中
发布于 2019-04-22 00:26:39
它设置了我的初始状态两次,一次是在我初始化我的存储时,另一次是在读取reducer初始状态时。我的reducer中的状态是一个空对象,就像在reducer“激活”的时候一样。最后,我意识到我并不是从任何地方读取某种“记忆”状态,我只是需要一些初始值。我把它移到了reducer中,并从我的应用程序中移除了不可变的js,因为它让人感到困惑。
给你们这些新手一些经验教训,让他们做出反应/重现传奇!不要试图把事情复杂化。学习不变的含义!自己找出是否需要它,在我的情况下,只有一个真理来源和访问状态就足够了。
https://stackoverflow.com/questions/54387519
复制相似问题