Как понять React Higher Order Components (HOC)?

внешний интерфейс функциональное программирование React.js Redux
Как понять React Higher Order Components (HOC)?

Эта статья подходит для студентов, которые хотят понять React High-Order Component и не знакомы с функциональным программированием. Она не подходит для студентов, которые знакомы с компонентами High-Order и функциональным программированием. Цель этой статьи — помочь учащимся, не имеющим опыта функционального программирования, понять высокоуровневые компоненты и получить представление о возможностях высокоуровневых компонентов.Я надеюсь, что вы сможете использовать высокоуровневые компоненты в своих проектах.

Ладно, ерунда закончилась, переходим к делу. Прежде чем говорить о том, что такое компонент более высокого порядка, давайте посмотрим, что такое компонент React:

const Person = props => <div>{props.name}</div>

Здесь компонент Person получает PROPS для возврата в React Element, который используется для вызова этого компонента для функционального компонента.Но вы можете думать о Person как о функции, которая получает реквизиты в качестве параметров и возвращает React Element.

Давайте посмотрим, что такое компонент более высокого порядка:

const identity = func => func

Тождество здесь принимает функцию, а затем возвращает функцию как есть Я сказал, что тождество является функцией высшего порядка, у вас не должно быть сомнений, верно? Да, тождество — это простая функция высшего порядка.Если мы понимаем компоненты как функции, компоненты более высокого порядка можно понимать как функции более высокого порядка. Функция высшего порядка принимает функцию в качестве параметра функции и возвращает функцию; компонент высшего порядка принимает компонент в качестве параметра функции и возвращает компонент.Теперь изменим форму идентификации:

const identity = BaseComponent => BaseComponent

Идентичность здесь — это простой компонент более высокого порядка, который берет компонент и возвращает его как есть. Проще говоря, я думаю, что компоненты более высокого порядка и функции более высокого порядка, по сути, одно и то же. Студенты, знакомые с ramdajs, должны быть знакомы с функцией идентификации, но наша идентификация здесь не очень полезна в качестве высокоуровневого компонента.

Некоторые студенты могут спросить, это этот компонент высокого уровня? Что такое использование? Давайте посмотрим на практический пример ниже:

const List = ({ data }) => (
  <ul>
    {data.map(item => <li key={item.name}>{item.name}</li>)}
  </ul>
)

У нас есть такой компонент списка, если мы хотим добавить функцию загрузки в этот компонент списка, мы можем сделать это следующим образом:

const List = ({ data, isLoading }) => (
  isLoading ?
    <div>我正在加载...</div> :
    <ul>
      {data.map(item => <li key={item.name}>{item.name}</li>)}
    </ul>
)

Давайте изменим код компонента List, чтобы он мог судить о том, происходит ли анимация загрузки в соответствии с состоянием isLoading. Это не невозможно сделать, но недостаточно элегантно. Во-первых, для этого требуется изменить код исходного компонента; во-вторых, если у нас есть другие компоненты, такие как таблица, которым также нужна функция загрузки, нам нужно повторить ту же логику суждения. Мы можем прекрасно решить две вышеупомянутые проблемы с компонентами/функциями более высокого порядка.

const withLoading = BaseComponent => ({ isLoading, ...otherProps }) => (
  isLoading ?
    <div>我正在加载...</div> :
    <BaseComponent {...otherProps} />
)

const LoadingList = withLoading(List)

Наш withLoading здесь принимает BaseComponent и возвращает расширенный компонент (LoadingList).Мы обрабатываем логику оценки загрузки внутри LoadingList, чтобы мы могли повторно использовать логику оценки загрузки без изменения кода List. В дальнейшем, если будут компоненты, которым нужна функция загрузки, я могу это сделать вызовом withLoading, а можно вызвать в виде декоратора (@withLoading).

@withLoading
class Table extends React.Component {
  //...
}

Использование withLoading очень похоже на использование withRouter в react-router, верно, withRouter — это высокоуровневый компонент, который вводит некоторые данные, связанные с маршрутизацией, во входящий компонент.

Давайте посмотрим на другой пример:

const flattern = propKey => BaseComponent => props => <BaseComponent {...props} {...props[propKey]} />

Наша функция Flatten приняла пропасть и вернула компонент с высоким порядком. Его роль состоит в том, чтобы сгладить ключ в реквизитах (форма немного похожа на сочетание в redux) в redux. Что такое выгода?

const FlatternLoadingList = flattern('list')(LoadingList)
...
// 我们就可以这样调用组件
<FlatternLoadingList list={...}/>
// 而不用像下面这样一个个手动传递 props
<LoadingList data={...} isLoading={...}/>

Предположим, мы перечисляем компоненты внутри параметров маршрутизатора, которые необходимо прочитать, весь процесс вызова становится таким:

const LoadingList = withLoading(List)

const FlatternLoadingList = flattern('list')(LoadingList)

const EnhancedList = withRouter(FlatternLoadingList)

// 或者是下面这样, 难以阅读
const EnhancedList2 = withRouter(flattern('list')(withLoading(List)))

Если нам потребуется вызывать все больше и больше высокоуровневых компонентов, процесс вызова станет громоздким и трудным для чтения.compose. Применение компоновки в функциональном программировании очень распространено, и функция компоновки также предоставляется в редукции. Для более подробного ознакомления с композицией см.здесь. использовать compose пишем так:

const EnhancedList = compose(
  withRouter,
  flattern('list'),
  withLoading,
)(List)

Это очень лаконично? Мы также можем использоватьpipeфункция, которая похожа на функцию составления, за исключением того, что ее порядок композиции — слева направо, а компоновка — справа налево.

Компоненты высшего порядка в этом паттерне были впервыеgistКак упоминалось выше, сейчас в сообществе React можно увидеть большое количество компонентов более высокого порядка и тень функционального программирования. Некоторые расширенные вопросы использования и производительности высокоуровневых компонентов здесь не обсуждаются, и заинтересованные студенты могут найти другую информацию самостоятельно.

Наконец, я надеюсь, что эта статья будет вам полезна, и я предлагаю вам систематически изучать функциональное программирование. Поначалу функциональное программирование может показаться странным и трудным для понимания, но придерживайтесь его, и вам понравится, ха-ха!

Ссылка на ссылку

Higher-Order Components - React

medium.com/@indignant оборванный…

Woohoo.YouTube.com/watch?V=BC V…

GitHub.com/mostly Куда пойти…

Woohoo.YouTube.com/watch?V=ZD_…