ES6 Деструктуризация

Деструктуризация — это мощный и удобный способ извлечения отдельных значений из массивов и объектов в JavaScript и присваивания их отдельным переменным. В React деструктуризация часто используется для работы с пропсами, хуками и управлением состоянием компонента.

Примечание: Деструктуризация улучшает читаемость и лаконичность кода React, уменьшая количество избыточных обращений к объектам и массивам.

Деструктуризация массивов

Ранее присвоение элементов массива отдельным переменным выглядело так:

Пример


const vehicles = ['mustang', 'f-150', 'expedition'];

// старый способ
const car = vehicles[0]; // mustang
const truck = vehicles[1]; // f-150
const suv = vehicles[2]; // expedition

// Теперь можно обращаться к каждому элементу отдельно:
document.getElementById('demo').innerHTML = truck;

Новый способ назначения элементов массива:

Пример


const vehicles = ['mustang', 'f-150', 'expedition'];

// с помощью деструктуризации
const [car, truck, suv] = vehicles;

// Теперь можно обращаться к каждому элементу отдельно:
document.getElementById('demo').innerHTML = truck;

Деструктуризация удобна, когда функция возвращает массив:

Пример


function dateInfo(date) {
  const day = date.getDate();       // День месяца
  const month = date.getMonth() + 1; // Номер месяца (начиная с нуля)
  const year = date.getFullYear();  // Год

  return [day, month, year];
}

// Назначение переменных через деструктуризацию
const [day, month, year] = dateInfo(new Date());

Пропуск значений

Порядок объявления переменных при деструктуризации массивов играет важную роль. Если нужны только некоторые элементы, можно пропустить промежуточные значения, оставив пробелы с запятыми:

Пример


const vehicles = ['mustang', 'f-150', 'expedition'];

// возьмем только первую и последнюю машины
const [car, , suv] = vehicles;


Деструктуризация объектов

Извлекать значения из объекта можно также при помощи деструктуризации.

Пример

Извлечение значений из объекта:


const person = {
  firstName: "John",
  lastName: "Doe",
  age: 50
};

// Обычный способ
let firstName = person.firstName;
let lastName = person.lastName;
let age = person.age;

// Деструктуризация
let { firstName, lastName, age } = person;

// Теперь можно обратиться к каждой переменной отдельно:
document.getElementById("demo").innerHTML = firstName;

При этом порядок свойств при деструктуризации объектов не важен.

Пример

Извлечение значений из объекта в случайном порядке:


const person = {
  firstName: "John",
  lastName: "Doe",
  age: 50
};

// Меняем порядок свойств при извлечении
let { lastName, age, firstName } = person;

Можно извлекать только нужные вам свойства.

Пример

Извлечение из объекта только свойства firstName:


const person = {
  firstName: "John",
  lastName: "Doe",
  age: 50
};

// Берем только нужное свойство
let { firstName } = person;

Для отсутствующих свойств можно устанавливать значения по умолчанию.

Пример

Устанавливаем значение по умолчанию для отсутствующего свойства:


const person = {
  firstName: "John",
  lastName: "Doe",
  age: 50
};

// Устанавливаем страну по умолчанию, если её нет
let { firstName, lastName, age, country = "Norway" } = person;

Если вы хотите присвоить извлеченные значения переменным с другими именами, вы можете использовать синтаксис переименования.

Пример

Передаем извлеченное значение переменной с другим именем:


const person = {
  name: 'John',
  age: 30,
  city: 'New York'
};

const { name: fullName, age: years, city: location } = person;
console.log(fullName); // John
console.log(years); // 30
console.log(location); // New York

Если объект содержит вложенные объекты, вы можете использовать вложенную деструктуризацию.

Пример

Извлекаем значения из вложенного объекта:


const person = {
  name: 'John',
  address: {
    city: 'New York',
    country: 'USA'
  }
};

const { name, address: { city, country } } = person;
console.log(name); // John
console.log(city); // New York
console.log(country); // USA

Деструктуризация также может использоваться в параметрах функций.

Пример

Старый способ использования объекта внутри функции:


const vehicleOne = {
  brand: 'Ford',
  model: 'Mustang',
  type: 'car',
  year: 2021, 
  color: 'red'
}

myVehicle(vehicleOne);

// старый способ
function myVehicle(vehicle) {
  const message = 'My ' + vehicle.type + ' is a ' + vehicle.color + ' ' + vehicle.brand + ' ' + vehicle.model + '.';
}

Новый способ использования объекта внутри функции:


const vehicleOne = {
  brand: 'Ford',
  model: 'Mustang',
  type: 'car',
  year: 2021, 
  color: 'red'
}

myVehicle(vehicleOne);

function myVehicle({type, color, brand, model}) {
  const message = 'My ' + type + ' is a ' + color + ' ' + brand + ' ' + model + '.';
}

Деструктуризация может быть использована в циклах для обработки массивов объектов.

Пример


const people = [
  { name: 'John', age: 30 },
  { name: 'Jane', age: 25 },
  { name: 'Bob', age: 35 }
];

for (const { name, age } of people) {
  console.log(`${name} is ${age} years old.`);
}


Деструктуризация в компонентах React

Особенно полезна деструктуризация в React при работе с пропсами, хуками и ответами API. Она помогает сделать код компактнее и чище.

Деструктуризация пропсов

Компонент, принимающий пропсы, может извлекать нужные значения с помощью деструктуризации.

Сравните два способа - с использованием деструктуризации и без нее:


// Использование деструктуризации:
function Greeting({ name, age }) {
  return <h1>Здравствуйте, {name}! Вам {age} лет.</h1>;
}

// Без использования деструктуризации:
function Greeting(props) {
  return <h1>Здравствуйте, {props.name}! Вам {props.age} лет.</h1>;
}

Рабочий пример:

Пример

Использование деструктуризации для извлечения пропсов:


import { createRoot } from 'react-dom/client';

function Greeting({ name, age }) {
  return <h1>Здравствуйте, {name}! Вам {age} лет.</h1>;
}

createRoot(document.getElementById('root')).render(<Greeting name="Иван" age={30} />);

Деструктуризация хука useState

При использовании хука useState в компоненте React также удобно применять деструктуризацию:

Пример

Использование деструктуризации для извлечения значений из хука useState:


import { createRoot, useState } from 'react-dom/client';

function Counter() {
  // Деструктуризация массива, возвращаемого useState
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>Счётчик: {count}</button>
  );
}

createRoot(document.getElementById('root')).render(<Counter />);


Таким образом, деструктуризация существенно сокращает объём кода и делает его намного более читаемым и аккуратным.