Comment valider les PropTypes d'un objet imbriqué dans ReactJS?


191

J'utilise un objet de données comme accessoire pour un composant dans ReactJS.

<Field data={data} />

Je sais qu'il est facile de valider l'objet PropTypes lui-même:

propTypes: {
  data: React.PropTypes.object
}

Mais que faire si je veux valider les valeurs à l'intérieur? c'est à dire. data.id, data.title?

props[propName]: React.PropTypes.number.required // etc...

Réponses:


360

Vous pouvez utiliser React.PropTypes.shapepour valider les propriétés:

propTypes: {
    data: React.PropTypes.shape({
      id: React.PropTypes.number.isRequired,
      title: React.PropTypes.string
    })
}

Mettre à jour

Comme @Chris l'a souligné dans les commentaires, à partir de React, la version 15.5.0 React.PropTypesest passée au package prop-types.

import PropTypes from 'prop-types';    

propTypes: {
    data: PropTypes.shape({
      id: PropTypes.number.isRequired,
      title: PropTypes.string
    })
}

Plus d'informations


1
Réponse précise @nilgun. Vous pouvez trouver la documentation pour les propTypes de React: facebook.github.io/react/docs/reusable-components.html
wle8300

React.PropTypesest désormais obsolète. Veuillez utiliser PropTypesà la prop-typesplace du package. Plus ici
Chris

13

Si React.PropTypes.shapecela ne vous donne pas le niveau de vérification de type souhaité, jetez un œil à tcomb-react .

Il fournit une toPropTypes()fonction qui vous permet de valider un schéma défini avec la bibliothèque tcomb en utilisant le support de React pour définir des propTypesvalidateurs personnalisés , en exécutant des validations à l'aide de tcomb-validation .

Exemple de base tiré de ses documents :

// define the component props
var MyProps = struct({
  foo: Num,
  bar: subtype(Str, function (s) { return s.length <= 3; }, 'Bar')
});

// a simple component
var MyComponent = React.createClass({

  propTypes: toPropTypes(MyProps), // <--- !

  render: function () {
    return (
      <div>
        <div>Foo is: {this.props.foo}</div>
        <div>Bar is: {this.props.bar}</div>
      </div>
    );
  }    
});

4

Je voulais noter que l'imbrication fonctionne au-delà d'un niveau de profondeur. Cela m'a été utile lors de la validation des paramètres d'URL:

propTypes = {
  match: PropTypes.shape({
    params: PropTypes.shape({
      id: PropTypes.string.isRequired
    })
  })
};

Cela signifie-t-il que le idn'est requis que s'il y a un match.paramsobjet ou que la isRequiredcascade, ce matchqui signifie est requise avec un paramsobjet avec un idaccessoire? autrement dit, si aucun paramètre n'était fourni, serait-il toujours valide?
S ..

Cela peut être lu comme « matchdoit avoir paramset paramsdoit avoir id».
rendez-vous le

Salut @datchung en fait, j'ai depuis découvert (et testé) comment il lit et c'est que si matchest présent et si matchcontient paramsalors il est nécessaire de paramscontenir une chaîne id.
S ..

-7
user: React.PropTypes.shap({
    age: (props, propName) => {
       if (!props[propName] > 0 && props[propName] > 100) {
          return new Error(`${propName} must be betwen 1 and 99`)
       }
       return null
    },
})

10
Comme beaucoup d'efforts ont manifestement été consacrés à cette réponse, il peut être difficile de comprendre s'il ne s'agit que de code. Il est habituel de commenter la solution en quelques phrases. Veuillez modifier votre réponse et ajouter quelques explications.
Mika Sundland
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.