Как повторно использовать вашу логику и сохранить ваш код СУХИМ
Что такое HOC?
Компонент более высокого порядка (HOC) - это продвинутая технология в React для повторного использования логики компонентов. По сути, HOC не являются частью React API. Это шаблон, который вытекает из композиционной природы React. - Реагировать на документы
Хорошо, возможно, это может быть сложно понять, но в документации React есть более простое определение:
Конкретно, компонент более высокого порядка - это функция, которая принимает компонент и возвращает новый компонент. - React docs
Теперь я думаю, что это более простой способ понять HOC. Но как это поможет вам повторно использовать ваш код? А как написать свой первый HOC?
Код без HOC
Предположим, ваше приложение React будет отображать таблицу пользователей. Для этого вы вызываете API и ждете, пока он вернет данные, одновременно показывая загрузчик и визуализируя возвращенные данные. Код может выглядеть примерно так:
Теперь у вас есть еще один компонент, который отображает таблицу команд. Вся логика такая же, как и в предыдущем компоненте:
Вы видите, что код почти такой же? Вот где HOC может помочь вам сделать ваш код более СУХИМ и удалить эту повторяющуюся логику при рендеринге ваших компонентов.
Код с HOC
Сначала вы создаете свой HOC следующим образом:
Цель этого HOC - получить Component
, в данном случае Table
компонент, плюс некоторые другие свойства для определения логики его рендеринга.
Теперь давайте используем его в ваших Users
и Teams
компонентах:
Вот и все! Вы инкапсулировали состояние загрузки и пустых данных в один файл, который можно повторно использовать в любой части вашего приложения. Когда вы оборачиваете компонент своим HOC, вы улучшаете этот компонент с помощью логики внутри HOC.
Используйте больше HOC!
Этот шаблон можно применять несколько раз к одному и тому же компоненту.
Хотите добавить нумерацию страниц? Просто создайте новый компонент HOC, например. withPagination
:
А затем просто используйте его в своем компоненте следующим образом:
Вопросов
Почему вы устанавливаете отображаемое имя HOC таким образом?
WithLoader.displayName = `WithLoader(${Component.displayName || Component.name || 'Component' })`
Это соглашение, которое React docs рекомендует использовать для облегчения отладки.
Почему вы объявляете расширенный компонент с HOC вне основного компонента?
Объявление внутри будет воссоздавать расширенный компонент при каждом рендеринге.
Почему вы передаете только {...props}
компоненту, который возвращается HOC?
Таким образом, вам не нужно беспокоиться о том, какие реквизиты нужны вашему компоненту, вы просто передаете их все, кроме тех, которые необходимы для рендеринга загрузчика, пустого состояния или разбивки на страницы.