React Redux TypeError: Invalid attempt to spread non-iterable instance

General Tech Bugs & Fixes 2 years ago

0 1 0 0 0 tuteeHUB earn credit +10 pts

5 Star Rating 1 Rating

Posted on 16 Aug 2022, this text provides information on Bugs & Fixes related to General Tech. Please note that while accuracy is prioritized, the data presented might not be entirely correct or up-to-date. This information is offered for general knowledge and informational purposes only, and should not be considered as a substitute for professional advice.

Take Quiz To Earn Credits!

Turn Your Knowledge into Earnings.

tuteehub_quiz

Answers (1)

Post Answer
profilepic.png
manpreet Tuteehub forum best answer Best Answer 2 years ago

 

Hi I'm using redux persist to persist and rehydrate my app. This is my productsReducer:

const initialState = {
  products: [],
  id: [],
  qty: [],
  numOfItems: 0,
  totalPrice: 0,
  status: '',
  showPopup: false
};

const productsReducer = (state = initialState, action) => {
  let updatedId = [...state.id];
  let updatedQty = [...state.qty];
  let index = updatedId.indexOf(action.id);

  switch (action.type) {
    case actionTypes.FETCH_PRODUCTS_REQUEST:
      return {
        ...state,
        status: action.status
      }

    case actionTypes.FETCH_PRODUCTS_SUCCESS:
      return {
        ...state,
        status: action.status,
        products: action.products
      }

    case actionTypes.TOGGLE_POPUP:
      return {
        ...state,
        showPopup: !state.showPopup
      }
    };
    .....
}

For reasons unknown to me, my persist/REHYDRATE actions show one key {showPopup: true} for productsReducer.

action     
{type: "persist/REHYDRATE", payload: {…}, err: undefined, key: "root", asyncDispatch: ƒ}
  asyncDispatch: ƒ asyncDispatch(asyncAction)
  err: undefined
  key: "root"
  payload:
  productsReducer: {showPopup: true}
  userReducer: ...
  _persist: {version: -1, rehydrated: true}
  __proto__: Object
  type: "persist/REHYDRATE"

After that FETCH_PRODUCTS_REQUEST, show productsReducer: {showPopup: true} too. This shows that the rehydration replaced productsReducer state in the beginning.

action FETCH_PRODUCTS_REQUEST
  prev state 
    {productsReducer: {…}, userReducer: {…}, _persist: {…}}
    productsReducer: {showPopup: true}

When the fetched products calls productsReducer, it tried to do let updatedId = [...state.id]. But that didn't work since productsReducer only have the state showPopup. That's when it threw the below error...

TypeError: Invalid attempt to spread non-iterable instance.

I suspect the fault lies in persist/REHYDRATE. How can I reset the app or reset rehydration then?

0 views
0 shares

No matter what stage you're at in your education or career, TuteeHub will help you reach the next level that you're aiming for. Simply,Choose a subject/topic and get started in self-paced practice sessions to improve your knowledge and scores.