Wie validieren Sie die PropTypes eines verschachtelten Objekts in ReactJS?


191

Ich verwende ein Datenobjekt als Requisiten für eine Komponente in ReactJS.

<Field data={data} />

Ich weiß, dass es einfach ist, das PropTypes-Objekt selbst zu validieren:

propTypes: {
  data: React.PropTypes.object
}

Aber was ist, wenn ich die darin enthaltenen Werte validieren möchte? dh. data.id, data.title?

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

Antworten:


359

Sie können verwenden React.PropTypes.shape, um Eigenschaften zu validieren:

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

Aktualisieren

Wie @Chris in den Kommentaren hervorhob, wurde ab React Version 15.5.0 React.PropTypesauf das Paket verschoben prop-types.

import PropTypes from 'prop-types';    

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

Mehr Info


1
Präzise Antwort @nilgun. Sie finden Dokumentation für die PropTypes von React: facebook.github.io/react/docs/reusable-components.html
wle8300

React.PropTypesist jetzt veraltet. Bitte verwenden Sie stattdessen PropTypesaus dem prop-typesPaket. Mehr hier
Chris

13

Wenn Sie React.PropTypes.shapenicht die gewünschte Stufe für die Typprüfung haben, schauen Sie sich tcomb-react an .

Es bietet eine toPropTypes()Funktion, mit der Sie ein mit der tcomb- Bibliothek definiertes Schema validieren können, indem Sie die Unterstützung von React zum Definieren benutzerdefinierter propTypesValidatoren nutzen und Validierungen mithilfe der tcomb-Validierung ausführen .

Grundlegendes Beispiel aus seinen Dokumenten :

// 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

Wollte beachten, dass das Verschachteln über eine Ebene hinaus funktioniert. Dies war für mich bei der Überprüfung von URL-Parametern hilfreich:

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

Bedeutet das, dass das idnur erforderlich ist, wenn es ein match.paramsObjekt gibt, oder die isRequiredKaskade, was matchbedeutet , dass es für ein paramsObjekt mit einer idRequisite erforderlich ist ? dh wenn keine Parameter angegeben würden, wäre dies immer noch gültig?
S ..

Dies kann als " matchmuss haben paramsund paramsmuss haben id" gelesen werden .
Datchung

Hallo @datchung eigentlich habe ich seitdem herausgefunden (und getestet) wie es liest und es ist dass wenn If matchvorhanden ist und If matchenthält paramsdann ist es erforderlich paramseinen String zu enthalten 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
Da offensichtlich viel Aufwand in diese Antwort gesteckt wurde, kann es schwierig sein, einen Überblick darüber zu bekommen, ob es sich nur um Code handelt. 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.
Mika Sundland
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.