![](/img/trans.png)
[英]When using Immutable.JS, should redux selectors always return Immutable.JS objects?
[英]Redux-Saga using Immutable.js and state is always empty
我正在尝试围绕 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;
};
组合 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。但是当它回到状态 switch 语句时,状态大小再次为零:
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 和状态管理?
我想确保您没有遗漏一个基本部分: sagaMiddleware.run(YOUR_SAGA);
在哪里sagaMiddleware.run(YOUR_SAGA);
称呼? 它是否隐藏在initSagas
?
它设置了我的初始状态两次,一次是在我初始化我的商店时,一次是在读取减速器初始状态时。 我在减速器中的状态是一个空对象,就像减速器“激活”时一样。 最后我意识到我不是从任何地方读取一些“记住”的状态,我只需要一些初始值。 我进入了 reducer 并从我的应用程序中删除了不可变的 js,因为它是令人困惑的事情。
给所有新手反应/redux-saga的一些教训! 不要试图把事情复杂化。 了解什么是不可变的! 如果您需要它,请自行弄清楚,在我的情况下,只有一个事实来源和访问状态就足够了。
进一步阅读: 初始化状态、 不可变和状态注意事项
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.