首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Redux-Saga使用Immutable.js,状态始终为空

Redux-Saga使用Immutable.js,状态始终为空
EN

Stack Overflow用户
提问于 2019-01-27 19:13:32
回答 2查看 504关注 0票数 1

我正试图把我的大脑包裹在redux和sagas中,我想我设置错了什么,我希望有人能提供一些见解。

我已经用我的初始状态创建了我的存储,并且我发送了一个操作,如下所示:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
export function* fetchSiteKeyValuesSaga() {
    yield take(RETRIEVE_SITE_KEY_VALUES) 
    const siteKeyValues = yield call(retrieveSiteKeyValues)
    yield put(storeSiteKeyValues(siteKeyValues));
}

我的reducer函数:

代码语言:javascript
复制
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。但是当它返回到状态切换语句时,状态大小又是零:

代码语言:javascript
复制
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),状态总是为空或“未定义”。

当我在浏览器中检查状态时,它看起来如下所示:

代码语言:javascript
复制
storeState:{
   [2],
   [2]
   [2]
 }

展开的数组如下所示:

代码语言:javascript
复制
0:"product"
1:{anotherObject :{}, anotherMap: map()
size:1

我希望作为有效负载一部分的值在这里,而不仅仅是新的objectmap

我是否在创建商店时错误地初始化了我的状态?我是否以错误的方式处理redux和状态管理?

EN

回答 2

Stack Overflow用户

发布于 2019-01-28 14:20:29

我想确保您没有遗漏一个基本部分:sagaMiddleware.run(YOUR_SAGA);调用在哪里?它是否隐藏在initSagas

票数 0
EN

Stack Overflow用户

发布于 2019-04-22 00:26:39

它设置了我的初始状态两次,一次是在我初始化我的存储时,另一次是在读取reducer初始状态时。我的reducer中的状态是一个空对象,就像在reducer“激活”的时候一样。最后,我意识到我并不是从任何地方读取某种“记忆”状态,我只是需要一些初始值。我把它移到了reducer中,并从我的应用程序中移除了不可变的js,因为它让人感到困惑。

给你们这些新手一些经验教训,让他们做出反应/重现传奇!不要试图把事情复杂化。学习不变的含义!自己找出是否需要它,在我的情况下,只有一个真理来源和访问状态就足够了。

进一步阅读:Initalising StateImmutable and State considerations

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54387519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档