#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 для получения обновлений по этому вопросу.