Skip to content

Instantly share code, notes, and snippets.

@moimikey
Last active June 5, 2023 04:50
Show Gist options
  • Save moimikey/b6e7a1540837cc00fa32 to your computer and use it in GitHub Desktop.
Save moimikey/b6e7a1540837cc00fa32 to your computer and use it in GitHub Desktop.
object literals for redux reducers
// O(1)
const todo = (state, action) => {
const actions = {
ADD_TODO: () => {
return {
id: action.id,
text: action.text,
completed: false
}
},
TOGGLE_TODO: () => {
if (state.id !== action.id) return state
return {
...state,
completed: !state.completed
}
}
}
return {
default: state,
...actions
}[action.type || 'default']
}
// O(n)
const todo = (state, action) => {
switch (action.type) {
case 'ADD_TODO':
return {
id: action.id,
text: action.text,
completed: false
}
case 'TOGGLE_TODO':
if (state.id !== action.id) {
return state
}
return {
...state,
completed: !state.completed
}
default:
return state
}
}
@SooJungChae
Copy link

SooJungChae commented Jun 26, 2020

Thank you for your sharing. How do you execute method? I am using useReducer hook and need to add function call syntax to execute method.

return {
    default: state,
    ...actions,
  }[action.type || 'default']();

@moimikey
Copy link
Author

moimikey commented Jul 7, 2021

Thank you for your sharing. How do you execute method? I am using useReducer hook and need to add function call syntax to execute method.

return {
    default: state,
    ...actions,
  }[action.type || 'default']();

in the case of my last reply:

export const actions = {
  ADD_TODO: () => {
    return {
      id: action.id,
      text: action.text,
      completed: false
    }
  },
  TOGGLE_TODO: () => {
    if (state.id !== action.id) return state
    return {
      ...state,
      completed: !state.completed
    }
  }
}

export const todo = (state, action) => {
  return {
    default: state,
    ...actions
  }[action.type || 'default']
}

you can use the actions object directly:

actions.TOGGLE_TODO()

however, to take full advantage, you'd wanna do a little editing to actions to accomodate for arguments:

export const actions = {
  ADD_TODO: (action) => {
    return {
      id: action.id,
      text: action.text,
      completed: false
    }
  },
  TOGGLE_TODO: (action, state) => {
    if (state.id !== action.id) return state
    return {
      ...state,
      completed: !state.completed
    }
  }
}

@avomakesart
Copy link

This is super helpful and readable. Thanks 😊

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment