2014-11-14 17 views
130

Ich verwende ein Datenobjekt als meine Requisiten für eine Komponente in ReactJS.Wie validieren Sie die PropTypes eines verschachtelten Objekts in ReactJS?

<Field data={data} /> 

ich weiß, ist es einfach die PropTypes zu validieren selbst Objekt:

propTypes: { 
    data: React.PropTypes.object 
} 

Aber was, wenn ich will innerhalb der Werte validieren? dh. data.id, data.title?

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

Antwort

234

Sie können React.PropTypes.shape verwenden, um Eigenschaften zu überprüfen:

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

aktualisieren

Wie @ Chris in Kommentaren darauf hingewiesen, wie von React Version 15.5.0 React.PropTypes bewegt hat prop-types zu verpacken .

import PropTypes from 'prop-types';  

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

More info

+1

präzise Antwort @nilgun. Sie finden die Dokumentation zu Reacts propTypes: https://facebook.github.io/react/docs/reusable-components.html – williamle8300

+0

'React.PropTypes' ist jetzt veraltet. Bitte verwenden Sie stattdessen 'PropTypes' aus dem Paket' prop-types'. [Mehr hier] (https://facebook.github.io/react/blog/2017/04/07/react-v15.5.0.html#migrating-from-react.proptypes) – Chris

13

Wenn React.PropTypes.shape Sie das Niveau der Typ nicht geben Prüfung Sie wollen, haben einen Blick auf tcomb-react.

Es bietet eine toPropTypes() Funktion, die Sie mit der tcomb Bibliothek definiert Validierung eines Schemas können durch die Nutzung von Unterstützung durch die Reaktion custom propTypes validators zur Definition, Lauf Validierungen tcomb-validation verwenden.

Basic example from its docs:

// 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> 
    ); 
    }  
}); 
-1
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 
    }, 
}) 
+3

So viel Aufwand ist offensichtlich in diese gegangen Antwort, es könnte schwierig sein, einen Griff zu bekommen, wenn es nur Code ist. Es ist üblich, die Lösung mit ein paar Sätzen zu kommentieren. Bitte bearbeiten Sie Ihre Antwort und fügen Sie eine Erklärung hinzu. – MikaS

Verwandte Themen