DEV Community

Cover image for Efficient use of JavaScript Object and Array Destructuring in React
Kaemon Lovendahl
Kaemon Lovendahl

Posted on

Efficient use of JavaScript Object and Array Destructuring in React

In the JavaScript and React world, object and array destructuring are powerful features that allow developers to extract data from arrays or objects into distinct variables. This is particularly useful when dealing with complex state objects or props in a React component. I often don't see this used often enough. Although appearing complicated and puzzling, desctructuring can make code cleaner, easier, and more fun to work with.

This article will demonstrate how to effectively utilize JavaScript destructuring in the context of a React application using a fun and relatable table-top RPG theme!

What is Destructuring in JavaScript?

Introduced in ECMAScript 6 (ES6), destructuring provides a way to extract values into variables from data stored in objects and arrays.

With Objects:

// Object destructuring
const hero = { name: "Mattelion Smitherion", level: 12, class: "Articifer" };
const { name, level, class } = hero;
console.log(name, level, class); // "Mattelion Smitherion" 12 "Articifer"
Enter fullscreen mode Exit fullscreen mode

Don't like the variable names name, level, or class? You can change them!

const { name: title, level: skill, class: role } = hero;
console.log(title, skill, role); // "Mattelion Smitherion" 12 "Articifer" < -- It's the same!
Enter fullscreen mode Exit fullscreen mode

With Arrays:

// Array destructuring
const inventory = ["Staff", "bow", "potion"];
const [item1, item2, item3] = inventory;
console.log(item1, item2, item3); // "Staff" "bow" "potion"
Enter fullscreen mode Exit fullscreen mode

Destructuring in React Components

In React, destructuring can be especially helpful when managing props or state. Let's roll a d20 and dive into practical examples.

Destructuring Props

React components receive data through props. Destructuring can be used to unpack values from these props. Here is a simple component representing a D&D character:

const CharacterCard = (props) => {
  return (
    <div>
      <h2>{props.character.name}</h2>
      <p>{props.character.class}</p>
      <p>{props.character.level}</p>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

You can use destructuring to unpack the props object into distinct variables:

const CharacterCard = ({ character }) => {
  const { name, class: charClass, level } = character;

  return (
    <div>
      <h2>{name}</h2>
      <p>{charClass}</p>
      <p>{level}</p>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

Notice that we used class: charClass in the destructuring statement. This is because class is a reserved keyword in JavaScript. By using this syntax, we rename the class variable to charClass.

Destructuring State

React's useState hook returns an array with two elements: the current state and a function to update it. Array destructuring is an idiomatic way to handle this:

const [count, setCount] = React.useState(0);
Enter fullscreen mode Exit fullscreen mode

Suppose we have a complex state object representing a RPG character and their inventory:

const [character, setCharacter] = React.useState({
  name: "Mattelion Smitherion",
  level: 12,
  class: "Articifer",
  inventory: ["staff", "rope", "rock"],
});
Enter fullscreen mode Exit fullscreen mode

We could destructure this state object in our render method to make our code cleaner:

const { name, level, class: charClass, inventory } = character;
Enter fullscreen mode Exit fullscreen mode

Then, use these variables within the component's JSX:

return (
  <div>
    <h2>{name}</h2>
    <p>{charClass}</p>
    <p>{level}</p>
    <p>Inventory: {inventory.join(', ')}</p>
  </div>
);
Enter fullscreen mode Exit fullscreen mode

This will display the character's name, class, level, and a list of their inventory items.

Nested Destructuring

Nested destructuring can be handy if the data structure is more complex. For example, let's add a stats property to our character:

const [character, setCharacter] = React.useState({
  name: "Mattelion Smitherion",
  level: 12,
  class: "Articifer",
  inventory: ["staff", "rope", "rock"],
  stats: {
    strength: 8,
    dexterity: 10,
    constitution: 14,
    intelligence: 18,
    wisdom: 16,
    charisma: 10,
  },
});
Enter fullscreen mode Exit fullscreen mode

You can destructure these nested properties like this:

const {
  name,
  level,
  class: charClass,
  inventory,
  stats: { strength, dexterity, constitution, intelligence, wisdom, charisma },
} = character;
Enter fullscreen mode Exit fullscreen mode

Now, you have direct access to each stat for your character, allowing you to display these within your component:

return (
  <div>
    <h2>{name}</h2>
    <p>{charClass}</p>
    <p>{level}</p>
    <p>Inventory: {inventory.join(', ')}</p>
    <p>Strength: {strength}</p>
    <p>Dexterity: {dexterity}</p>
    <p>Constitution: {constitution}</p>
    <p>Intelligence: {intelligence}</p>
    <p>Wisdom: {wisdom}</p>
    <p>Charisma: {charisma}</p>
  </div>
);
Enter fullscreen mode Exit fullscreen mode

Conclusion

JavaScript destructuring is an incredibly powerful feature, particularly in a React. It makes the code cleaner and more readable by reducing the redundancy and verbosity in your component. Through this themed example, you can now apply this knowledge to create a more effective, efficient and scalable application. Happy coding!

Top comments (1)

Collapse
 
brense profile image
Rense Bakker

There is also a real performance benefit to destructuring props and state in React because React does shallow comparison to determine if something needs to rerender. When you destruct state and props objects into strings/numbers/booleans, you get much better control over the rerendering of child components that use those destructured variables.