คุณจะตรวจสอบ 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.PropTypesprop-types

import PropTypes from 'prop-types';    

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

ข้อมูลเพิ่มเติม


1
คำตอบที่แม่นยำ @nilgun คุณสามารถค้นหาเอกสารประกอบสำหรับ propTypes ของ React: facebook.github.io/react/docs/reusable-components.html
wle8300

React.PropTypesเลิกใช้แล้ว กรุณาใช้PropTypesจากprop-typesแพ็คเกจแทน เพิ่มเติมได้ที่นี่
Chris

13

ถ้าReact.PropTypes.shapeไม่ให้ระดับของการตรวจสอบชนิดที่คุณต้องการมีลักษณะที่tcomb ทำปฏิกิริยา

มันมีtoPropTypes()ฟังก์ชั่นที่ช่วยให้คุณตรวจสอบสคีมากำหนดด้วยtcombห้องสมุดโดยการใช้ตอบสนองการสนับสนุนสำหรับการกำหนดที่กำหนดเองpropTypesvalidatorsทำงานการตรวจสอบโดยใช้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น้ำตกหมายmatchisrequired กับparamsวัตถุที่มีidเสา? เช่นหากไม่มีการจัดหาพารามิเตอร์จะยังคงใช้ได้หรือไม่
เอส ..

สิ่งนี้สามารถอ่านได้ว่า " matchจำเป็นต้องมีparamsและparamsจำเป็นต้องมีid"
datchung

สวัสดี @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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.