コンポーネントに渡されるオブジェクトの配列が実際に特定の形状のオブジェクトの配列であることを保証するためにプロタイプを使用する組み込みの方法はありますか?
たぶんこんな感じ?
annotationRanges: PropTypes.array(PropTypes.shape({
start: PropTypes.number.isRequired,
end: PropTypes.number.isRequired,
})),
ここで明らかな何かが足りないのですか。これは非常に人気があるようです。
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,
}
はい、コードで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を使った型チェック ここ
そしてそれは…私の鼻のすぐ下にあります。
反応ドキュメント自体から: https://facebook.github.io/react/docs/reusable-components.html
// An array of a certain type
optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number),
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: [],
}
}
特定の形状に対して同じ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)
}
これは、空の配列からも保護するための私の解決策でした。
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`)
}
}
}