형태와 반응 형 배열


245

구성 요소에 전달되는 객체 배열이 실제로 특정 모양의 객체 배열인지 확인하기 위해 proptype을 사용하는 기본 제공 방법이 있습니까?

아마도 이런 식으로 뭔가?

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

여기에 명백한 것이 빠져 있습니까? 이것처럼 많이 찾는 것 같습니다.

답변:


371

다음에 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,
}

설명서 의 소품 검증 섹션을 참조하십시오 .

최신 정보

현재 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,
}

17
.isRequired각 속성에 대한 사용을 지적 할 가치가 React.PropTypes.shape있습니다. .isRequiredon 을 사용하여 React.PropTypes.arrayOf내부에서 필요하지 않다고 잘못 가정했기 때문에 여기에 도착했습니다 . 전체 적용 범위 검증을 달성하기 위해 실제로 직접 적용했습니다 React.PropTypes.shape.
gfullam

1
예, 나는 당신과 똑같은 일을하고 있었지만 원하는 키를 필요에 따라 플래그 지정할 수있는 것이 더 강력합니다. 그건 그렇고 나에게 암묵적보다 항상 암묵적입니다.
Pierre Criulanscy

이 예제는 나를 위해 올바르게 유효성 검사에 실패하지 않습니다. if arrayWithShape가 [] (빈 배열) 이면 실패하지 않습니다. 경우 arrayWithShape는 {} (객체)는 그것이 실패 않습니다. 경우 arrayWithShape 이다 [{dumb: 'something'}](정확한 소품없는 배열)는 실패한다. arrayWithShape빈 배열 이면 유효성 검사에 실패해야합니다 . 나는 단지 그것을 소품이 물체가 아닌 빈 배열 인 경우는 전달할 color하고 fontsize. 내가 무엇을 놓치고 있습니까?
sdc

50

예, 코드 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으로 유형 검사 여기


3
PropTypes.shape 객체에 .isRequired를 추가 한 이유는 무엇입니까?
makovkastar

@makovkastar 그것 없이는 [undefined]유효성 검사를 통과 할 것입니다
user123


6

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: [],
  }
}

1
좋은 답변을 작성하려면 어떻게합니까?를 검토하십시오 . 코드 전용 답변은 질문에서 문제를 해결하는 방법을 설명하지 않기 때문에 권장하지 않습니다. 이것이 무엇을하고이 질문이 이미 가지고있는 상향식 답변에서 어떻게 개선되는지 설명하기 위해 답변을 업데이트해야합니다.
FluffyKitten

1

특정 모양에 대해 동일한 proptypes를 여러 번 정의하려면 proptypes 파일로 추상화하여 객체의 모양이 변경되면 한 곳에서만 코드를 변경하면됩니다. 코드베이스를 약간 건조시키는 데 도움이됩니다.

예:

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

이것은 빈 배열로부터 보호하는 솔루션이었습니다.

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`)
    }
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.