Так что вам не придется переделывать работу

Оглавление

  • Как создаются крючки
  • Можем ли мы объединить варианты
  • Почему это работает
  • Заключение

Как создаются крючки

Когда мы создаем кастомный хук со сложной логикой в ​​React, мы либо возвращаем массив, либо объект с состоянием и логикой. Далее показан процесс:

1. Возврат объекта

Первый вариант — вернуть объект из пользовательского хука, например:

const customHook = (configs) => {
  const isLoading = true //logic
  const reload    = () => {/*logic*/}
  return { isLoading, reload }
}

Использование будет выглядеть так:

const { isLoading, reload } = customHook(configs)

Где:

  • Это удобно для разработчиков, где вам не нужно запоминать порядок реквизитов.
  • IntelliSense поможет вам узнать параметры

Но когда мы используем несколько таких хуков, это выглядит некрасиво. Это будет выглядеть так:

const { 
  isLoading: isLoadingWidget1, 
  reload: reloadWidget1 
} = customHook(widget1Config)
const { 
  isLoading: isLoadingWidget2, 
  reload: reloadWidget2 
} = customHook(widget2Config)
const { 
  isLoading: isLoadingWidget3, 
  reload: reloadWidget3 
} = customHook(widget3Config)

Что не очень приятно. Мы должны переименовать каждый ключ в другой, чтобы они не конфликтовали.

2. Возврат массива

Другой вариант — вернуть массив из пользовательского хука, как показано ниже:

const customHook = (configs) => {
  const isLoading = true //logic
  const reload    = () => {/*logic*/}
  return [isLoading, reload]
}

Использование будет выглядеть так:

const [isLoadingWidget1, reloadWidget1] = customHook(widget1Config)
const [isLoadingWidget2, reloadWidget2] = customHook(widget2Config)
const [isLoadingWidget3, reloadWidget3] = customHook(widget3Config)

Где:

  • Это решает проблему многократного использования. Вам не нужно переименовывать каждую клавишу.

Но:

  • Вы должны поддерживать порядок реквизита
  • Не имеет того же IntelliSense, что и в Objects.

Можем ли мы объединить варианты

Можем ли мы объединить эти шаблоны вместе? В смысле, если вы хотите использовать его как массив или как объект для того же хука.

Да, это возможно. Посмотрите на эту реализацию:

const customHook = () => {  
  const isLoading = true //logic
  const reload    = () => {/*logic*/}
  const result = [isLoading, reload]
  result.isLoading = isLoading
  result.reload    = reload
  return result
}

result — это массив, но мы добавляем к нему ключи isLoading и reload.

Эта реализация даст нам возможность использовать возвращаемое значение хука как:

  1. Объект
const { isLoading, reload } = customHook(configs)

2.Массив

const [isLoading, reload] = customHook(configs)

Оба эти варианта будут работать. Но почему…

Почему это работает

Почему можно использовать как возвращаемые типы Array, так и Object? Почему можно прикреплять ключи к массиву?

Объект Array, как и массивы в других языках программирования, позволяет «сохранять набор из нескольких элементов под одним именем переменной и имеет элементы для выполнения общих операций с массивами. — МДН

Как уже упоминалось, «объект Array». Это показывает тот факт, что массив на самом деле является просто объектом со специальным конструктором и набором методов, выполняющих обычные операции с массивами.

Доказательство того, что массив на самом деле является объектом

  1. Доказательство 1
typeof [] // 'object'

Да, typeof приведет к 'object'

2. Доказательство 2

const {0: first, 1: second} = [1, 2, 3, 4] // first: 1, second: 2

Мы можем уничтожить объект массива, используя индексы, потому что ключи в любом массиве — это просто индексы и значения объекта, и это то, что вы передаете между скобками []. Вот почему мы можем уничтожить его и переименовать ключи таким образом.

3. Доказательство 3

const { length } = [1, 2, 3, 4]

Массив — это объект, в котором также есть ключ length.

4. Доказательство 4

Object.keys([1, 2, 3, 4])   // ['0', '1', '2', '3']
Object.values([1, 2, 3, 4]) // [1, 2, 3, 4]

Object.keys и Object.values работают только с объектами, а массив — это объект (специальный объект).

Заключение

Мы только что видели паттерн, который позволяет нам сделать так, чтобы возвращаемое значение хуков уничтожалось как массив или как объект. Мы видели, как это полезно. И мы увидели, почему это возможно, потому что все дело в том, что массивы — это просто объекты с крышкой.

Ресурсы

  1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array