2015-08-26 24 views
14

Tôi muốn biết nếu có một cách tốt hơn để có điều kiện vượt qua một prop hơn bằng cách sử dụng một tuyên bố nếu.React: inline điều kiện vượt qua prop để thành phần

Ví dụ, ngay bây giờ tôi có:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    if(this.props.editable) { 
     return (
     <Child editable={this.props.editableOpts} /> 
    ); 
    } else { 
     // In this case, Child will use the editableOpts from its own getDefaultProps() 
     return (
     <Child /> 
    ); 
    } 
    } 
}); 

Có cách nào để viết những dòng này mà không có sự if-tuyên bố? Tôi đã suy nghĩ một cái gì đó dọc theo dòng của một loại inline-nếu-tuyên bố trong JSX:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    return (
     <Child 
     {this.props.editable ? editable={this.props.editableOpts} : null} 
     /> 
    ); 
    } 
}); 

Để quấn-up: Tôi đang cố gắng để tìm một cách để xác định một chỗ dựa cho Child chuyền, tuy nhiên một giá trị (hoặc làm điều gì đó khác) sao cho Child vẫn kéo giá trị của giá trị đó từ số của riêng mình getDefaultProps().

+0

Bạn có thể đưa mã cho 'Child' không? Ngoài ra, bạn có nghĩa là để nói '' thay vì ''? –

+0

@JimSkerritt Tôi không nhầm lẫn các đạo cụ, mặc dù tôi biết nó trông như vậy. Tôi đang cố gắng sử dụng ['phản ứng-bootstrap-table'] (http://allenfang.github.io/react-bootstrap-table/example.html) và đó là định dạng mà họ sử dụng. Tôi không chắc chắn mã 'Child' thực sự quan trọng đối với những gì tôi hỏi, đó là lý do tại sao tôi không đưa nó vào. Tôi thực sự chỉ cần tìm một cách để tùy ý vượt qua hoặc không vượt qua một prop để 'Child' mà không đòi hỏi phải có một số lượng lớn các mã tương tự trong if-báo cáo trong' Parent'. –

+1

Gotcha, chỉ cần kiểm tra :) Tôi sẽ có câu trả lời cho bạn ngay –

Trả lời

31

Bạn đã gần gũi với ý tưởng của mình. Nó chỉ ra rằng đi qua undefined cho một prop là giống như không bao gồm nó ở tất cả, mà vẫn sẽ kích hoạt giá trị prop mặc định. Vì vậy, bạn có thể làm một cái gì đó như thế này:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    return <Child 
     editable={this.props.editable ? 
        this.props.editableOpts : 
        undefined} 
    />; 
    } 
}); 
+0

Ồ, tuyệt vời! Bạn có thấy rằng trong tài liệu ở đâu đó không? Tôi đã tìm kiếm điều đó nhưng không thể tìm thấy bất cứ điều gì trong một tìm kiếm nhanh –

+0

không chắc chắn nếu nó có trong tài liệu hay không, chỉ cần một cái gì đó tôi đã học được trong khi sử dụng React :) –

+1

'null' không được trang bị sức mạnh như 'undefined ', BTW. – Season

1

Xác định props biến:

let props = {}; 
if (this.props.editable){ 
    props.editable = this.props.editable; 
} 

Và sau đó sử dụng nó trong JSX:

<Child {...props} /> 

Dưới đây là một giải pháp trong mã của bạn:

var parent = React.createClass({ 
    propTypes: { 
    editable: React.PropTypes.bool.isRequired, 
    editableOpts: React.PropTypes.shape({...}) 
    }, 
    render: function() { 
    let props = {}; 
    if (this.props.editable){ 
     props.editable = this.props.editable; 
    } 
    return (
     <Child {...props} /> 
    ); 
    } 
}); 

Nguồn, Phản ứng tài liệu: https://facebook.github.io/react/docs/jsx-in-depth.html#spread-attributes

-1
const CleaningItem = ({ disabled = false }) => (
<View 
    style={[styles.container, disabled && styles.disabled]} 
    pointerEvents={disabled ? 'none' : 'auto'} 
> 
    <Button 
     disabled={disabled || null} 
     title="SELECT" 
    /> 
</View> 
); 
+0

Nó sẽ được tốt đẹp nếu bạn viết một vài từ ngoài để giải thích code của bạn – Yannick

+0

nếu bạn vượt qua một chỗ dựa tàn tật để phần CleaningItem nó phần sẽ bị vô hiệu hóa và áp dụng phong cách vô hiệu hóa (styles.disabled) – Denis

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