1

我正试图围绕 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它为零。由于我的初始状态,我预计大小至少为 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

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

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

4

2 回答 2

0

它设置了我的初始状态两次,一次是在我初始化我的商店时,另一次是在读取减速器初始状态时。我在减速器中的状态是一个空对象,就像在减速器“激活”时一样。最后我意识到我不是从任何地方读取一些“记住”的状态,我只需要一些初始值。我将其移入减速器并从我的应用程序中删除了不可变的 js,因为这很令人困惑。

给所有新手反应/redux-saga 的一些教训!不要试图让事情变得过于复杂。了解不可变的含义!如果需要,请自行弄清楚,在我的情况下,只需拥有一个事实来源并访问状态就足够了。

进一步阅读: 初始化状态不可变和状态考虑

于 2019-04-21T16:26:38.707 回答
0

我想确保您没有遗漏一个基本部分:sagaMiddleware.run(YOUR_SAGA);电话在哪里?是不是藏在里面initSagas

于 2019-01-28T06:20:29.010 回答