React: nội tuyến có điều kiện chuyển prop tới component


81

Tôi muốn biết liệu có cách nào tốt hơn để chuyển một mệnh đề có điều kiện hơn là sử dụng câu lệnh if.

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 điều này mà không cần câu lệnh if không? Tôi đang suy nghĩ điều gì đó dọc theo dòng của một loại câu lệnh nội tuyến-if-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} 
      />
    );
  }
});

Tóm lại : Tôi đang cố gắng tìm cách xác định một điểm hỗ trợ Child, nhưng chuyển một giá trị (hoặc làm điều gì đó khác) để Childvẫn lấy giá trị của điểm hỗ trợ đó từ giá trị Childcủa chính nó getDefaultProps().


Bạn có thể bao gồm cả mã Childkhông? Ngoài ra, bạn có ý định nói <Child editableOpts={this.props.editableOpts} />thay vì <Child editable={this.props.editableOpts} />?
Jim Skerritt

@JimSkerritt Tôi không nhầm lẫn giữa 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 react-bootstrap-tablevà đó là định dạng mà họ sử dụng. Tôi không chắc Childmã thực sự quan trọng đối với những gì tôi đang hỏi, đó là lý do tại sao tôi không đưa nó vào. Tôi thực sự chỉ đang tìm một cách để tùy chọn chuyển hoặc không truyền một phần hỗ trợ Childmà không yêu cầu phải có một lượng lớn mã tương tự trong các câu lệnh if trong Parent.
Matthew Herbst

1
Gotcha, chỉ kiểm tra :) Tôi sẽ có một câu trả lời cho bạn trong thời gian ngắn
Jim Skerritt

Câu trả lời:


141

Bạn đã kết thúc với ý tưởng của mình. Nó chỉ ra rằng việc chuyển undefinedcho một chỗ dựa cũng giống như không bao gồm nó, điều này vẫn sẽ kích hoạt giá trị chống đỡ mặc định. Vì vậy, bạn có thể làm một cái gì đó như sau:

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}
    />;
  }
});

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

không chắc chắn nếu nó 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 Phản ứng :)
Jim Skerritt

8
nullkhông được trang bị sức mạnh như undefinedBTW.
Phần

2
thủ thuật hữu ích! Rất mong có nguồn lực tốt về làm thế nào để sử dụng hiệu quả các kỹ thuật có điều kiện vẽ
nicodjimenez

1
Trong falsetrường hợp nó không hoạt động với tôi theo cách tôi muốn - tôi vẫn nhận được một cặp khóa-giá trị property:: null. Vẫn có thể làm điều đó bằng cách nào đó với một phần tử JSX duy nhất?
Gal Grünfeld,

26

Thêm toán tử spread vào this.props.editable:

<Child {...(this.props.editable ? {editable: {this.props.editableOpts}} : {})} >

nên làm việc.


1
Điều này không mang lại kết quả giống như editable = {this.props.editable? this.props.editableOpts: undefined} Hay có sự khác biệt?
garyee

1
@garyee: sự khác biệt là một số thành phần có thể coi không chính xác undefinedlà ghi đè (như null, luôn luôn là ghi đè), vì vậy cách duy nhất để giữ giá trị mặc định thay vì đặt nó thành giá trị sai là không chuyển nó, không chuyển undefined.
Yann Dìnendal

@ YannDìnendal thì sao nếu tôi sử dụng một đối tượng trống thay vì không xác định, chẳng hạn như <Child {... (this.props.editable? {Editable: {this.props.editableOpts}}: {)}> Nó có tạo ra sự khác biệt nào không? cái nào tốt hơn?
sktguha

1
@sktguha: đúng vậy, tôi nghĩ giống như một lỗi đánh máy: chúng ta không thể phát tán không xác định nên có, nó phải là một {}ở cuối. Tôi sẽ đề xuất một ấn bản, cảm ơn :)
Yann Dìnendal

17

Xác định propsbiến:

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

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

<Child {...props} />

Đâ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, tài liệu React: https://facebook.github.io/react/docs/jsx-in-depth.html#spread-attributes


Tôi thích giải pháp này. childPropsMặc dù vậy, tôi sẽ sử dụng để tránh nhầm lẫn
Daniel Reina

4

Trên thực tế, nếu prop của bạn là boolean thì không cần thực hiện điều kiện nhưng nếu bạn muốn thêm prop bằng điều kiện nội tuyến, bạn nên viết như dưới đây:

const { editable, editableOpts } = this.props;
return (
  <Child {...(editable && { editable: editableOpts } )} />
);

Hy vọng nó không làm bạn bối rối. các {...phương tiện đó là hành lây lan như truyền đạo cụ tồn tại: {...props}editable &&phương tiện nếu editabletruecác { editable: editableOpts }đối tượng sẽ thực hiện và với {...chúng ta sẽ làm cho một đối tượng mới như nó: {...{ editable: editableOpts }}nó có nghĩa editable={editableOpts}nhưng nếu this.porps.editablelà sự thật.


0
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})} 
      />
    );
  }
});

Điều này sẽ vượt qua các đạo cụ nếu chúng được xác định. Các đạo cụ khác không được thông qua. Trong câu trả lời khác, đạo cụ vẫn được chuyển nhưng giá trị undefinedvẫn có nghĩa là đạo cụ đang được chuyển.


1
Chuyển undefinedđến một điểm tựa tương đương với việc không vượt qua nó.
Matthew Herbst

Tôi hiểu. Tôi chỉ muốn nó được rõ ràng! Cảm ơn!
sanair96

0

Ngoài ra, bạn có thể thử cách tay ngắn này

 <Child {...(this.props.editable  && { editable: this.props.editableOpts })} />
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.