Je viens de remplacer certains composants de réaction définis à l'aide de classes es6 et je reçois maintenant des avertissements indiquant que mon composant sans état de réaction (qui ne fonctionne que) n'est pas un ReactNode.
Warning: Failed propType: Invalid prop `Loader` supplied to `Picture`, expected a ReactNode.
Je validais certains composants en utilisant React.PropTypes.node
, mais maintenant j'ai besoin d'utiliser PropTypes.oneOfType([ PropTypes.node, PropTypes.func ])
ce qui semble un peu long pour dire "cela peut être tout ce qui peut être rendu en tant que composant" (ce qui est ce que ProTypes.node
est censé couvrir, non ?).
De la doc
// Anything that can be rendered: numbers, strings, elements or an array
// (or fragment) containing these types.
optionalNode: React.PropTypes.node,
Peut-être que func
devrait être ajouté ? Ou y a-t-il une raison pour laquelle node
ne gère pas aussi func
?
Qu'en est-il de l'ajout d'un nouveau validateur propType ? Quelque chose comme
propTypes: {
optionalComponent: React.PropTypes.component
}
où le composant aurait la forme de
PropTypes.oneOfType([ PropTypes.node, PropTypes.func ])
ou quelque chose de similaire. À mon avis, il est assez dangereux de laisser passer les gens dans les fonctions, mais je ne sais pas comment faire une meilleure validation. Lire function.toString
semble être un hack gigantesque qui ne fonctionnerait pas après minification, mais c'est la seule option que je connaisse.
Pouvez-vous montrer comment vous l'utilisiez ? Je ne pense pas non plus que les classes de composants auraient dû être valides pour node
. node
est censé accepter tout ce qui peut être rendu. Les classes ne peuvent pas être rendues directement - vous passeriez un élément avec le type défini.
Oh mon Dieu. Tu as tellement raison. Je me sens stupide. Je suppose que je validais quelque chose dans le mauvais sens. Désolé pour le bruit.
Commentaire le plus utile
Pouvez-vous montrer comment vous l'utilisiez ? Je ne pense pas non plus que les classes de composants auraient dû être valides pour
node
.node
est censé accepter tout ce qui peut être rendu. Les classes ne peuvent pas être rendues directement - vous passeriez un élément avec le type défini.