Acabei de substituir alguns componentes react que foram definidos usando classes es6 e agora estou recebendo avisos sobre meu componente react stateless (que são apenas funções) não sendo um ReactNode.
Warning: Failed propType: Invalid prop `Loader` supplied to `Picture`, expected a ReactNode.
Eu estava validando alguns componentes usando React.PropTypes.node
, mas agora preciso usar PropTypes.oneOfType([ PropTypes.node, PropTypes.func ])
que parece um pouco longo para dizer "isso pode ser qualquer coisa que possa ser renderizada como um componente" (que é o que ProTypes.node
deve cobrir certo?).
Do documento
// Anything that can be rendered: numbers, strings, elements or an array
// (or fragment) containing these types.
optionalNode: React.PropTypes.node,
Talvez func
deva ser adicionado? Ou há alguma razão pela qual node
não lida com func
também?
Que tal adicionar um novo validador propType? Algo como
propTypes: {
optionalComponent: React.PropTypes.component
}
onde o componente teria forma de
PropTypes.oneOfType([ PropTypes.node, PropTypes.func ])
ou algo semelhante. Na minha opinião é muito perigoso deixar as pessoas passarem funções, mas não tenho certeza de como fazer uma validação melhor. Ler function.toString
parece um hack gigantesco que não funcionaria após a minificação, mas esta é a única opção que conheço.
Você pode mostrar como você estava usando isso? Eu também não acho que as Classes de Componentes deveriam ser válidas para node
. node
deve aceitar qualquer coisa que possa ser renderizada. As classes não podem ser renderizadas diretamente - você passaria um elemento com o tipo definido.
Oh meu Deus. Você está tão certo. Eu me sinto estúpido. Acho que estava validando algo do jeito ruim. Desculpe o barulho.
Comentários muito úteis
Você pode mostrar como você estava usando isso? Eu também não acho que as Classes de Componentes deveriam ser válidas para
node
.node
deve aceitar qualquer coisa que possa ser renderizada. As classes não podem ser renderizadas diretamente - você passaria um elemento com o tipo definido.