Я только что заменил некоторые реагирующие компоненты, которые были определены с использованием классов es6, и теперь я получаю предупреждения о том, что мой реагирующий компонент без состояния (это просто функция), не являющийся ReactNode.
Warning: Failed propType: Invalid prop `Loader` supplied to `Picture`, expected a ReactNode.
Я проверял некоторые компоненты, используя React.PropTypes.node
, но теперь мне нужно использовать PropTypes.oneOfType([ PropTypes.node, PropTypes.func ])
, что кажется немного длинным, чтобы сказать: «это может быть что угодно, что может быть отрисовано как компонент» (именно это то, что ProTypes.node
должно покрывать, верно?).
Из документа
// Anything that can be rendered: numbers, strings, elements or an array
// (or fragment) containing these types.
optionalNode: React.PropTypes.node,
Может стоит добавить func
? Или есть какая-то причина, по которой node
также не обрабатывает func
?
Как насчет добавления нового валидатора propType? Что-то типа
propTypes: {
optionalComponent: React.PropTypes.component
}
где компонент будет иметь вид
PropTypes.oneOfType([ PropTypes.node, PropTypes.func ])
или что-то подобное. На мой взгляд, довольно опасно позволять людям передавать функции, но я не уверен, как сделать лучшую проверку. Чтение function.toString
кажется гигантским хаком, который не будет работать после минификации, но это единственный известный мне вариант.
Можете ли вы показать, как вы использовали это? Я не думаю, что классы компонентов также должны быть действительны для node
. Предполагается, что node
принимает все, что может быть отображено. Классы не могут быть отображены напрямую — вы бы передали элемент с установленным типом.
Боже мой. Ты так прав. Я чувствую себя глупо. Я предполагаю, что я проверял что-то плохое. Извините за шум.
Самый полезный комментарий
Можете ли вы показать, как вы использовали это? Я не думаю, что классы компонентов также должны быть действительны для
node
. Предполагается, чтоnode
принимает все, что может быть отображено. Классы не могут быть отображены напрямую — вы бы передали элемент с установленным типом.