Как вы проверяете PropTypes вложенного объекта в ReactJS?

191

Я использую объект данных в качестве реквизита для компонента в ReactJS.

<Field data={data} />

Я знаю, что легко проверить сам объект PropTypes:

propTypes: {
  data: React.PropTypes.object
}

Но что, если я хочу проверить значения внутри? то есть. data.id, data.title?

props[propName]: React.PropTypes.number.required // etc...
Адам
источник

Ответы:

360

Вы можете использовать React.PropTypes.shapeдля проверки свойств:

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

Обновить

Как отметил @Chris в комментариях, с версии React 15.5.0 React.PropTypesперешел на пакет prop-types.

import PropTypes from 'prop-types';    

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

Больше информации

Nilgun
источник
1
Точный ответ @nilgun. Вы можете найти документацию для propTypes React: facebook.github.io/react/docs/reusable-components.html
wle8300
React.PropTypesсейчас устарела. Пожалуйста, используйте PropTypesиз prop-typesпакета вместо. Больше здесь
Крис
13

Если React.PropTypes.shapeвы не можете получить требуемый уровень проверки типа, взгляните на tcomb-реагировать .

Он предоставляет toPropTypes()функцию, которая позволяет проверять схему, определенную в библиотеке tcomb , используя поддержку React для определения пользовательских propTypesвалидаторов , выполняя валидации с использованием tcomb-validation .

Базовый пример из документации :

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

Хотел заметить, что вложение работает за пределы одного уровня. Это было полезно для меня при проверке параметров URL:

propTypes = {
  match: PropTypes.shape({
    params: PropTypes.shape({
      id: PropTypes.string.isRequired
    })
  })
};
datchung
источник
Означает ли это, что idтребуется только при наличии match.paramsобъекта или isRequiredкаскад, то есть matchisRequired с paramsобъектом с idподпоркой? то есть, если параметры не были предоставлены, будет ли он все еще действительным?
S ..
Это можно прочитать как « matchнужно иметь paramsи paramsнужно иметь id».
Датчунг
Привет @datchung на самом деле я с тех пор узнал (и проверил), как он читает, и что, если matchприсутствует и если matchсодержит, paramsто требуется, paramsсодержит строку 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
Поскольку в этот ответ было вложено много усилий, может быть трудно понять, является ли он просто кодом. Обычно комментируют решение несколькими предложениями. Пожалуйста, отредактируйте свой ответ и добавьте пояснения.
Мика Сандленд