ReactJSでネストされたオブジェクトのPropTypeをどのように検証しますか?


191

ReactJSのコンポーネントの小道具としてデータオブジェクトを使用しています。

<Field data={data} />

PropTypesオブジェクト自体を検証するのは簡単です。

propTypes: {
  data: React.PropTypes.object
}

しかし、内部の値を検証したい場合はどうなりますか?すなわち。data.id、data.title?

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

回答:


359

を使用React.PropTypes.shapeしてプロパティを検証できます。

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

更新

@Chrisがコメントで指摘したように、Reactバージョン15.5.0以降React.PropTypesはpackageに移動しましたprop-types

import PropTypes from 'prop-types';    

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

より詳しい情報


1
正確な回答@nilgun。ReactのpropTypesのドキュメントを見つけることができます:facebook.github.io/react/docs/reusable-components.html
wle8300

React.PropTypesは非推奨になりました。代わりPropTypesprop-typesパッケージから使用してください。詳細はこちら
Chris

13

React.PropTypes.shape必要なタイプチェックのレベルが得られない場合は、tcomb-reactを確認してください。

Reactのカスタムバリデーターの定義のサポートを利用し、tcomb-validationを使用して検証を実行することによりtoPropTypes()tcombライブラリーで定義されたスキーマを検証できる関数を提供します。propTypes

そのドキュメントからの基本的な例

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

ネストは1レベルを超えて機能することに注意してください。これは、URLパラメータを検証するときに私に役立ちました。

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

どういう意味ということidがある場合にのみ必要とされるmatch.paramsオブジェクトがたりないisRequiredカスケードを意味する、matchとIsRequiredこのparams持つオブジェクトid小道具?つまり、パラメータが指定されていない場合でも有効ですか?
S ..

「これを読み取ることができるmatch持っている必要がありますparamsし、params持っている必要がありますid」。
ダッチング

こんにちは@datchung実際に私はそれがどのように読み取られるかを発見(およびテスト)して以来、If matchが存在し、If 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
明らかに多くの努力がこの答えに費やされているので、それが単なるコードであるかどうかを把握することは難しいかもしれません。ソリューションに数文でコメントするのが一般的です。回答を編集して、説明を追加してください。
Mika Sundland 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.