Як ви перевіряєте 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
    })
}

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


1
Точна відповідь @nilgun. Ви можете знайти документацію про власні типи 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-валідації .

Основний приклад з його документів :

// 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
    })
  })
};

Чи означає idце, що потрібне лише за наявності match.paramsоб'єкта або isRequiredкаскаду, тобто matchвимагається з paramsоб'єктом з idопорою? тобто, якби не були надані парами, чи все-таки це було б дійсно?
С ..

Це можна прочитати як " matchпотрібно мати paramsі paramsпотрібно мати id".
дечунг

Привіт @datchung насправді я з тих пір дізнався (і перевірив), як він читається, і це те, що якщо matchвін присутній і якщо matchмістить, paramsто він обов'язково paramsмістить рядок id.
С ..

-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
Як багато зусиль, очевидно, вкладено в цю відповідь, може бути важко зрозуміти, якщо це просто код. Зазвичай це рішення коментується кількома реченнями. Відредагуйте свою відповідь і додайте пояснення.
Mika Sundland
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.