2015-12-15 43 views
15

Tôi muốn kiểm tra trực quan các thành phần React. Người dùng có thể thay đổi đạo cụ của thành phần bằng cách sử dụng một biểu mẫu. Tôi muốn có thể (ví dụ) để hiển thị một số <select> dựa trên React.PropTypes.oneOf(['green', 'blue', 'yellow']).Trích xuất/đọc React propTypes

Khi tôi đọc MyComponent.propTypes, nó trả về một hàm được xác định bởi React. Có cách nào để trích xuất/đọc các loại chống đỡ?

+0

Nó cũng sẽ thực sự thú vị để programatically có thể đọc các đạo cụ mặc định sử dụng có thể 'getDefaultProps' chức năng. – Vadorequest

Trả lời

7

Bạn không thể đọc trực tiếp từ propTypes từ đó, như bạn nói, chúng được định nghĩa như chức năng.

Thay vào đó, bạn có thể xác định các propTypes của mình ở định dạng trung gian, từ đó bạn sẽ tạo ra các mã propTypes tĩnh.

var myPropTypes = { 
    color: { 
    type: 'oneOf', 
    value: ['green', 'blue', 'yellow'], 
    }, 
}; 

function processPropTypes(propTypes) { 
    var output = {}; 
    for (var key in propTypes) { 
    if (propTypes.hasOwnProperty(key)) { 
     // Note that this does not support nested propTypes validation 
     // (arrayOf, objectOf, oneOfType and shape) 
     // You'd have to create special cases for those 
     output[key] = React.PropTypes[propTypes[key].type](propTypes[key].value); 
    } 
    } 
    return output; 
} 

var MyComponent = React.createClass({ 
    propTypes: processPropTypes(myPropTypes), 

    static: { 
    myPropTypes: myPropTypes, 
    }, 
}); 

Sau đó, bạn có thể truy cập vào định dạng propTypes tùy chỉnh của bạn thông qua MyComponent.myPropTypes hoặc element.type.myPropTypes.

Đây là trợ giúp để làm cho quy trình này dễ dàng hơn một chút.

function applyPropTypes(myPropTypes, Component) { 
    Component.propTypes = processPropTypes(myPropTypes); 
    Component.myPropTypes = propTypes; 
} 

applyPropTypes(myPropTypes, MyComponent); 
+0

Tôi đã hy vọng rằng bước trung gian là không cần thiết, nhưng than ôi, nó rõ ràng, dễ dàng và duy trì, vậy tại sao không ... Cảm ơn bạn. – GijsjanB

+2

Tôi ước có một cách tốt hơn. Chúng tôi thực sự nghĩ về một người trong đội của mình và chúng tôi sẽ thử nó. Tôi sẽ đưa ra một phản hồi ở đây nếu nó tốt hơn. – Vadorequest

+0

@Vadorequest bạn có thể đưa ra giải pháp không? –

2

Có thể thêm một ví dụ mã về những gì bạn đang cố gắng làm vì tôi không hoàn toàn hiểu nhưng tại sao bạn lại truy cập propTypes? PropTypes không chứa các giá trị mà đúng hơn là mong đợi các loại giá trị của bạn nên dành cho các đạo cụ khác nhau được chuyển vào thành phần.

Nếu bạn có một biểu mẫu cho phép bạn thay đổi các đạo cụ, tôi cho rằng bạn đang chuyển trong phần tử vào thành phần sẽ hiển thị thành phần được chọn. Bạn có thể truy cập các đạo cụ này thông qua đối tượng đạo cụ.

Nếu bạn đang cố gắng để xác nhận propTypes rằng có thể có các hình thức khác nhau sau đây có thể được sử dụng:

optionalUnion: React.PropTypes.oneOfType([ 
    React.PropTypes.string, 
    React.PropTypes.number, 
    React.PropTypes.instanceOf(Message) 
]) 
+1

Anh ta muốn hiển thị các 'propTypes' được xác định của một thành phần React động để hiển thị các thuộc tính của thành phần cho một người dùng cuối. Tôi thực sự muốn làm như vậy, cho mục đích tài liệu. – Vadorequest

+0

Chính xác! Đã không nhìn vào điều này gần đây hoặc nghiên cứu nó hơn nữa mặc dù. – GijsjanB

Các vấn đề liên quan