Come convalidare i PropTypes di un oggetto nidificato in ReactJS?


191

Sto usando un oggetto dati come oggetti di scena per un componente in ReactJS.

<Field data={data} />

So che è facile convalidare l'oggetto PropTypes stesso:

propTypes: {
  data: React.PropTypes.object
}

Ma cosa succede se voglio convalidare i valori all'interno? vale a dire. data.id, data.title?

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

Risposte:


360

È possibile utilizzare React.PropTypes.shapeper convalidare le proprietà:

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

Aggiornare

Come ha sottolineato @Chris nei commenti, a partire dalla versione 15.5.0 di React React.PropTypesè passato al pacchetto prop-types.

import PropTypes from 'prop-types';    

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

Ulteriori informazioni


1
Risposta precisa @nilgun. Puoi trovare la documentazione per i propTypes di React: facebook.github.io/react/docs/reusable-components.html
wle8300

React.PropTypesè ora obsoleto. Si prega di utilizzare PropTypesdal prop-typespacchetto invece. Altro qui
Chris,

13

Se React.PropTypes.shapenon ti dà il livello di controllo del tipo che desideri, dai un'occhiata a tcomb-reazioni .

Fornisce una toPropTypes()funzione che consente di convalidare uno schema definito con la libreria tcomb facendo uso del supporto di React per la definizione di propTypesvalidatori personalizzati , eseguendo convalide utilizzando la convalida tcomb .

Esempio di base dai suoi documenti :

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

Volevo notare che la nidificazione funziona oltre un livello di profondità. Questo è stato utile per me durante la convalida dei parametri URL:

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

Significa che idè richiesto solo se c'è un match.paramsoggetto o fa la isRequiredcascata, il che significa che è necessario matchcon un paramsoggetto con un oggetto id? vale a dire, se non fosse fornito alcun parametro sarebbe comunque valido?
S ..

Questo può essere letto come " matchdeve avere paramse paramsdeve avere id".
datchung

Ciao @datchung in realtà da allora ho scoperto (e testato) come legge ed è che If matchè presente e If matchcontiene paramsquindi è necessario paramscontenere una stringa 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
Dato che ovviamente è stata posta molta attenzione in questa risposta, potrebbe essere difficile capire se si tratta solo di codice. È normale commentare la soluzione con poche frasi. Modifica la tua risposta e aggiungi alcune spiegazioni.
Mika Sundland,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.