Redux-Saga, использующий Immutable.js и состояние всегда пусто - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь обернуть голову вокруг редукса и саг, и я думаю, что что-то настроил неправильно, и я надеюсь, что кто-то может дать некоторую информацию.

Я создал свой магазин с моим начальным состоянием иЯ отправляю действие, как показано здесь:


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;
};

Комбинированные редукторы от неизменяемого редукса.

Моя функция саги:

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 из-за моего initalState.Когда 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.

Неправильно ли я инициирую свое состояние при создании магазина?Неправильно ли я отношусь к управлению редукциями и государственными делами?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Он дважды устанавливал мое начальное состояние, один раз, когда я инициализировал свой магазин, и снова, когда читалось начальное состояние редуктора.Мое состояние в моем редукторе было пустым объектом, как если бы во время «активации» редуктора.В конце концов, я понял, что нигде не читаю «запомненное» состояние, мне просто нужны были некоторые начальные ценности.Который я переместил в редуктор и извлек неизменные js из моего приложения, поскольку это сбивало с толку.

Несколько уроков для всех новичков, чтобы реагировать / redux-saga!Не пытайтесь усложнить ситуацию.Узнайте, что значит неизменное!Выясните для себя, если вам это нужно, в моем случае достаточно было одного источника правды и доступа к государству.

Дополнительное чтение: Инициализирующее состояние , Неизменные и государственные соображения

0 голосов
/ 28 января 2019

Я хочу убедиться, что вы не пропустили основную часть: где вызов sagaMiddleware.run(YOUR_SAGA);?Это скрыто внутри initSagas?

...