web-dev-qa-db-ja.com

形状を持つ反応型の配列型

コンポーネントに渡されるオブジェクトの配列が実際に特定の形状のオブジェクトの配列であることを保証するためにプロタイプを使用する組み込みの方法はありますか?

たぶんこんな感じ?

annotationRanges: PropTypes.array(PropTypes.shape({
    start: PropTypes.number.isRequired,
    end: PropTypes.number.isRequired,
})),

ここで明らかな何かが足りないのですか。これは非常に人気があるようです。

203
majorBummer

React.PropTypes.shape()の引数としてReact.PropTypes.arrayOf()を使うことができます。

// an array of a particular shape.
ReactComponent.propTypes = {
   arrayWithShape: React.PropTypes.arrayOf(React.PropTypes.shape({
     color: React.PropTypes.string.isRequired,
     fontSize: React.PropTypes.number.isRequired,
   })).isRequired,
}

ドキュメントの Prop Validation セクションを参照してください。

_ update _

react v15.5の時点では、React.PropTypesの使用は推奨されておらず、代わりにスタンドアロンパッケージprop-typesを使用する必要があります。

// an array of a particular shape.
import PropTypes from 'prop-types'; // ES6 
var PropTypes = require('prop-types'); // ES5 with npm
ReactComponent.propTypes = {
   arrayWithShape: PropTypes.arrayOf(PropTypes.shape({
     color: PropTypes.string.isRequired,
     fontSize: PropTypes.number.isRequired,
   })).isRequired,
}
301

はい、コードでPropTypes.arrayOfの代わりにPropTypes.arrayを使用する必要があります、あなたはこのようなことをすることができます:

import PropTypes from 'prop-types';

MyComponent.propTypes = {
  annotationRanges: PropTypes.arrayOf(
    PropTypes.shape({
      start: PropTypes.string.isRequired,
      end: PropTypes.number.isRequired
    }).isRequired
  ).isRequired
}

proptypes についての詳細は、 PropTypesを使った型チェック ここ

41
Alireza

そしてそれは…私の鼻のすぐ下にあります。

反応ドキュメント自体から: https://facebook.github.io/react/docs/reusable-components.html

// An array of a certain type
    optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
24
majorBummer

ES6速記インポートがあります、あなたは参照することができます。読みやすく、入力が簡単です。

import React, { Component } from 'react';
import { arrayOf, shape, number } from 'prop-types';

class ExampleComponent extends Component {
  static propTypes = {
    annotationRanges: arrayOf(shape({
      start: number,
      end: number,
    })).isRequired,
  }

  static defaultProps = {
     annotationRanges: [],
  }
}
4
Moewiz

特定の形状に対して同じproptypeを複数回定義する場合は、それをproptypesファイルに抽象化して、オブジェクトの形状が変わってもコードを1箇所で変更するだけでよいのです。それは少しコードベースを枯渇させるのを助けます。

例:

// Inside my proptypes.js file
import PT from 'prop-types';

export const product = {
  id: PT.number.isRequired,
  title: PT.string.isRequired,
  sku: PT.string.isRequired,
  description: PT.string.isRequired,
};


// Inside my component file
import PT from 'prop-types';
import { product } from './proptypes;


List.propTypes = {
  productList: PT.arrayOf(product)
}
1
Yo Wakita

これは、空の配列からも保護するための私の解決策でした。

import React, { Component } from 'react';
import { arrayOf, shape, string, number } from 'prop-types';

ReactComponent.propTypes = {
  arrayWithShape: (props, propName, componentName) => {
    const arrayWithShape = props[propName]
    PropTypes.checkPropTypes({ arrayWithShape:
        arrayOf(
          shape({
            color: string.isRequired,
            fontSize: number.isRequired,
          }).isRequired
      ).isRequired
    }, {arrayWithShape}, 'prop', componentName);
    if(arrayWithShape.length < 1){
      return new Error(`${propName} is empty`)
    }
  }
}
0
sdc