Làm thế nào để bạn xác nhận PropTypes của một đối tượng lồng nhau trong ReactJS?


191

Tôi đang sử dụng một đối tượng dữ liệu làm đạo cụ cho một thành phần trong ReactJS.

<Field data={data} />

Tôi biết thật dễ dàng để xác thực chính đối tượng PropTypes:

propTypes: {
  data: React.PropTypes.object
}

Nhưng nếu tôi muốn xác nhận các giá trị bên trong thì sao? I E. data.id, data.title?

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

Câu trả lời:


359

Bạn có thể sử dụng React.PropTypes.shapeđể xác nhận các thuộc tính:

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

Cập nhật

Như @Chris đã chỉ ra trong các bình luận, kể từ phiên bản React 15.5.0 React.PropTypesđã chuyển sang gói prop-types.

import PropTypes from 'prop-types';    

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

Thêm thông tin


1
Câu trả lời chính xác @nilgun. Bạn có thể tìm tài liệu cho propTypes của React: facebook.github.io/react/docs/reUs-components.html
wle8300

React.PropTypesbây giờ không được dùng nữa Vui lòng sử dụng PropTypestừ prop-typesgói thay thế. Thêm tại đây
Chris

13

Nếu React.PropTypes.shapekhông cung cấp cho bạn mức độ kiểm tra loại bạn muốn, hãy xem phản ứng tcomb .

Nó cung cấp một toPropTypes()hàm cho phép bạn xác thực một lược đồ được xác định với thư viện tcomb bằng cách sử dụng hỗ trợ của React để xác định các propTypestrình xác nhận tùy chỉnh , chạy xác thực bằng cách sử dụng xác thực tcomb .

Ví dụ cơ bản từ các tài liệu của nó :

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

Muốn lưu ý rằng việc làm tổ vượt quá một cấp độ sâu. Điều này hữu ích cho tôi khi xác thực các thông số URL:

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

Điều đó có nghĩa idlà chỉ được yêu cầu nếu có một match.paramsđối tượng hoặc isRequiredtầng, có nghĩa là matchĐược đáp ứng với một paramsđối tượng có chỗ dựa id? tức là, nếu không có thông số nào được cung cấp thì nó vẫn còn hiệu lực chứ?
S ..

Điều này có thể được đọc là " matchcần phải có paramsparamscần phải có id".
datchung

Xin chào @datchung thực sự tôi đã tìm ra (và đã kiểm tra) cách đọc và đó là Nếu matchcó mặt và Nếu matchparamsthì nó được yêu cầu paramschứa một chuỗi 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
Nhiều nỗ lực rõ ràng đã đi vào câu trả lời này, có thể khó nắm bắt được nếu đó chỉ là mã. Nó là bình thường để bình luận các giải pháp với một vài câu. Vui lòng chỉnh sửa câu trả lời của bạn và thêm một số giải thích.
Mika Sundland
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.