Cheat Sheet for Updating Objects and Arrays in React State

Andrew Lee - May 4 '20 - - Dev Community

If we want to use arrays or objects in our React state, we have to create a copy of the value before modifying it. This is a cheat sheet on how to do add, remove, and update items in an array or object within the context of managing React state.

Arrays

const [todos, setTodos] = useState([]);
Enter fullscreen mode Exit fullscreen mode

Add to array

const handleAdd = (todo) => {
  const newTodos = todos.slice();
  newTodos.push(todo);
  setTodos(newTodos);
}
Enter fullscreen mode Exit fullscreen mode

The spread operator is syntactic sugar for creating a new copy of a reference.

const handleAdd = (todo) => {
  const newTodos = [...todos];
  newTodos.push(todo);
  setTodos(newTodos);
}
Enter fullscreen mode Exit fullscreen mode

We can also use the spread operator to create copy and append an item with the following syntax:

const handleAdd = (todo) => {
  setTodos([...todos, todo]);
}
Enter fullscreen mode Exit fullscreen mode

Remove from array

const handleRemove = (todo) => {
  const newTodos = todos.filter((t) => t !== todo);
  setTodos(newTodos);
}
Enter fullscreen mode Exit fullscreen mode

Update array

const handleUpdate = (index, todo) => {
  const newTodos = [...todos];
  newTodos[index] = todo;
  setTodos(newTodos);
}
Enter fullscreen mode Exit fullscreen mode

Objects

const [todos, setTodos] = useState({});
Enter fullscreen mode Exit fullscreen mode

Add to object

const handleAdd = (todo) => {
  const newTodos = Object.assign({}, todos);
  newTodos[todo.id] = todo;
  setTodos(newTodos);
}
Enter fullscreen mode Exit fullscreen mode

We can use spread operator to create shallow copy as well.

const handleAdd = (todo) => {
  const newTodos = {...todos};
  newTodos[todo.id] = todo;
  setTodos(newTodos);
}
Enter fullscreen mode Exit fullscreen mode

Similar to arrays, there's a shortcut for doing this in one line:

const handleAdd = (todo) => {
  setTodos({...todos, [todo.id]: todo});
}
Enter fullscreen mode Exit fullscreen mode

Remove from object

const handleRemove = (todo) => {
  const newTodos = {...todos}
  delete newTodos[todo.id]
  setTodos(newTodos);
}
Enter fullscreen mode Exit fullscreen mode

Update object

Same as adding, it will overwrite the value if the key already exists.

const handleUpdate = (todo) => {
  setTodos({...todos, [todo.id]: todo});
}
Enter fullscreen mode Exit fullscreen mode
. . . . . . . . . . . . . . . . . . . . . . . . . .
Terabox Video Player