При каких условиях этот фрагмент кода (из документов React) может завершиться сбоем или, скорее, фактически вызвать окончательное резервное условие?

#reactjs #higher-order-components

#reactjs #компоненты более высокого порядка

Вопрос:

В документах React есть следующий фрагмент кода для извлечения имени компонента в HOC (функция getDisplayName). Смотрите Реализацию getDisplayName ниже.

 function withSubscription(WrappedComponent) {
  class WithSubscription extends React.Component {/* ... */}
  WithSubscription.displayName = `WithSubscription(${getDisplayName(WrappedComponent)})`;
  return WithSubscription;
}

function getDisplayName(WrappedComponent) {
  return WrappedComponent.displayName || WrappedComponent.name || 'Component';
}
 

Итак, в каких случаях функция не сможет получить имя компонента? и просто верните общую строку ‘Component’. И если да, то какие-либо способы смягчения / обработки таких случаев?

Комментарии:

1. Да, как class es, так и функции (функциональные компоненты) имеют .name s . Интересно, какие крайние случаи они рассматривали 'Component'

2. @CertainPerformance да! любопытно узнать. было бы здорово, если бы член основной команды React мог взглянуть на него!

3. В случаях, когда параметр не имеет ни свойства DisplayName, ни name . React написан с использованием потоковой типизации; явные типы часто означают более консервативный код, чтобы гарантировать, что возвращаемый тип выполняется. Посмотрите на фактическую реализацию инструментов разработки, например: github.com/facebook/react/blob /…

4. Конечно, @jonrsharpe. Спасибо за это. Но мне больше интересно узнать, в каких условиях это может произойти, и как их смягчить.

5. Я хочу уточнить @jonrsharpe, при каких условиях произойдет «параметр не имеет ни свойства DisplayName, ни name», если я использую компоненты класса. И как я мог бы смягчить их?

Ответ №1:

Итак, в каких случаях функция не сможет получить имя компонента?

Если данный компонент не имеет displayName или не является функцией или классом, например, когда он был создан React.forwardRef .

И если да, то какие-либо способы смягчения / обработки таких случаев?

В настоящее время для этого случая нет общедоступного API. Подписаться на https://github.com/facebook/react/issues/14319 для получения обновлений по этому вопросу.