Como você valida os PropTypes de um objeto aninhado no ReactJS?


191

Estou usando um objeto de dados como props para um componente no ReactJS.

<Field data={data} />

Eu sei que é fácil validar o próprio objeto PropTypes:

propTypes: {
  data: React.PropTypes.object
}

Mas e se eu quiser validar os valores internos? ie data.id, data.title?

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

Respostas:


360

Você pode usar React.PropTypes.shapepara validar propriedades:

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

Atualizar

Como o @Chris apontou nos comentários, a partir do React, a versão 15.5.0 React.PropTypespassou para o pacote prop-types.

import PropTypes from 'prop-types';    

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

Mais informações


1
Resposta precisa @nilgun. Você pode encontrar documentação para Reagir das propTypes: facebook.github.io/react/docs/reusable-components.html
wle8300

React.PropTypesagora está obsoleto. Por favor, use PropTypeso prop-typespacote. Mais aqui
Chris

13

Se React.PropTypes.shapenão lhe der o nível de verificação de tipo desejado, consulte tcomb-react .

Ele fornece uma toPropTypes()função que permite validar um esquema definido com a biblioteca tcomb , usando o suporte do React para definir validadores personalizadospropTypes , executando validações usando tcomb-validation .

Exemplo básico de seus 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

Queria observar que o aninhamento funciona além de um nível profundo. Isso foi útil para mim ao validar parâmetros de URL:

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

Isso significa que idsó é necessário se houver um match.paramsobjeto ou a isRequiredcascata, ou seja, é matchnecessário com um paramsobjeto com um idsuporte? ou seja, se nenhum parâmetro fosse fornecido, ainda seria válido?
S ..

Isso pode ser lido como " matchprecisa ter paramse paramsprecisa ter id".
datchung 12/02

Oi @datchung, na verdade, eu descobri (e testei) como ele lê e é que If matchestá presente e If matchcontém params, é necessário que paramscontenha uma string 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
Obviamente, quanto esforço foi feito para essa resposta, pode ser difícil entender se é apenas código. É comum comentar a solução com algumas frases. Edite sua resposta e adicione algumas explicações.
Mika Sundland #
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.