Building the Generic Action

Learn how to build the action discussed previously.

Potentially, we would like each of our data reducers to be able to handle a special UPDATE_DATA action and extract the relevant parts it needs:

const updateData = ({
  type: UPDATE_DATA,
  payload: {
    recipes: {
      63: {
        id: 63,
        name: 'French Toast',
        favorite: true,
        preparation: 'How to prepare...',
        ingredients: [5123, 729]
      }
    },
    ingredients: {
      5123: {
        id: 5123,
        name: 'Egg',
        quantity: 2
      },
      729: {
        id: 729,
        name: 'Milk',
        quantity: '2 cups'
      }
    }
  }
});

Using this approach, our recipe reducer’s support for UPDATE_DATA can be as simple as:

const recipesReducer = (state, action) => {
  switch (action.type) {
    case UPDATE_DATA:
      if (!('recipes' in action.payload)) return state;

      return Object.assign({}, state, {
        recipes: Object.assign({},
          state.recipes,
          action.payload.recipes
        )
      });
  }
};

Our reducer checks if the payload contains any recipes and merges the new data with the old recipes object, thus adding to or otherwise modifying it as needed.

Get hands-on with 1400+ tech skills courses.