¿Cómo se validan los PropTypes de un objeto anidado en ReactJS?


191

Estoy usando un objeto de datos como mi accesorio para un componente en ReactJS.

<Field data={data} />

Sé que es fácil validar el objeto PropTypes en sí mismo:

propTypes: {
  data: React.PropTypes.object
}

Pero, ¿qué pasa si quiero validar los valores dentro? es decir. data.id, data.title?

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

Respuestas:


360

Puede usar React.PropTypes.shapepara validar propiedades:

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

Actualizar

Como @Chris señaló en los comentarios, a partir de la versión React 15.5.0 se React.PropTypesha movido al paquete prop-types.

import PropTypes from 'prop-types';    

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

Más información


1
Respuesta precisa @nilgun. Puede encontrar documentación para los PropTypes de React: facebook.github.io/react/docs/reusable-components.html
wle8300

React.PropTypesahora está en desuso. Por favor, use PropTypesel prop-typespaquete en su lugar. Más aquí
Chris

13

Si React.PropTypes.shapeno le da el nivel de verificación de tipo que desea, eche un vistazo a tcomb-react .

Proporciona una toPropTypes()función que le permite validar un esquema definido con la biblioteca tcomb haciendo uso del soporte de React para definir validadores personalizadospropTypes , ejecutando validaciones usando tcomb-validation .

Ejemplo básico de sus documentos :

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

Quería tener en cuenta que la anidación funciona más allá de un nivel de profundidad. Esto fue útil para mí al validar los parámetros de URL:

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

¿ Eso significa que idsolo se requiere si hay un match.paramsobjeto o la isRequiredcascada, lo que significa que se matchrequiere con un paramsobjeto con un idaccesorio? es decir, si no se proporcionaran parámetros, ¿seguiría siendo válido?
S ..

Esto se puede leer como " matchnecesita tener paramsy paramsnecesita tener id".
datchung

Hola @datchung en realidad, desde entonces descubrí (y probé) cómo se lee y es que si matchestá presente y si matchcontiene, paramsentonces se requiere que paramscontenga una cadena 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
Como obviamente se ha invertido mucho en esta respuesta, podría ser difícil comprenderlo si es solo código. Es habitual comentar la solución con algunas oraciones. Edite su respuesta y agregue alguna explicación.
Mika Sundland
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.