Я определил класс следующим образом:
import { Popup } from 'semantic-ui-react'
const FamilyLink = ({ family, fields, PopupClass = Popup }) => React.createElement(PopupClass, {...})
FamilyLink.propTypes = {
PopupClass: PropTypes.node,
}
Popup
из semantic-ui-react
- это React Component
: https://github.com/Semantic-Org/Semantic-UI-React/blob/62d2feda4c89bb604ab39e3ae5d44f4b78769e7b/src/modules/Popup/Popup.js
Затем в другом компоненте Я назвал FamilyLink
так:
class PopupWithModal extends React.PureComponent {...}
<FamilyLink family={family} fields={FAMILY_FIELDS} PopupClass={PopupWithModal} />
Итак, теперь при рендеринге я ожидал, что React.PureComponent
будет передан как PopupClass
, что, на мой взгляд, должно быть хорошо, учитывая следующие определения React.PropTypes
:
https://reactjs.org/docs/typechecking-with-proptypes.html#proptypes
Однако ни PropTypes.node
, ни PropTypes.elementType
не работают, но только PropTypes.func
выдает ошибку в console:
Предупреждение: сбой PropType: Недопустимый проп PopupClass
, поставляемый FamilyLink
, ожидаемый ReactNode
Почему это так? Я понимаю, что и Component
, и PureComponent
являются функциями, которые можно увидеть здесь:
https://github.com/facebook/react/blob/0cf22a56a18790ef34c71bef14f64695c0498619/packages/react/src/ReactBaseClasses.js
Однако я бы предпочел PropTypes
ограничить Мой входной параметр только для компонента React
, а не для любых других произвольных функций. Кроме того, насколько я понимаю, он должен работать.
Обновление
Если мы обновим его до PropTypes.elementType
, мы получим следующую ошибку:
Предупреждение: сбойный тип пропуска: FamilyLink: тип пропуска PopupClass
недопустим; это должна быть функция, обычно из пакета prop-types
, но полученная undefined
С PropTypes.func
не дает каких-либо ошибок .