Cái này thì sao. Hãy xác định một If
thành phần trợ giúp đơn giản .
var If = React.createClass({
render: function() {
if (this.props.test) {
return this.props.children;
}
else {
return false;
}
}
});
Và sử dụng nó theo cách này:
render: function () {
return (
<div id="page">
<If test={this.state.banner}>
<div id="banner">{this.state.banner}</div>
</If>
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
CẬP NHẬT: Khi câu trả lời của tôi đang trở nên phổ biến, tôi cảm thấy bắt buộc phải cảnh báo bạn về mối nguy hiểm lớn nhất liên quan đến giải pháp này. Như đã chỉ ra trong một câu trả lời khác, mã bên trong <If />
thành phần luôn được thực thi bất kể điều kiện là đúng hay sai. Do đó, ví dụ sau sẽ thất bại trong trường hợp banner
là null
(lưu ý quyền truy cập thuộc tính trên dòng thứ hai):
<If test={this.state.banner}>
<div id="banner">{this.state.banner.url}</div>
</If>
Bạn phải cẩn thận khi sử dụng nó. Tôi đề nghị đọc các câu trả lời khác cho các phương pháp thay thế (an toàn hơn).
CẬP NHẬT 2: Nhìn lại, cách tiếp cận này không chỉ nguy hiểm mà còn rất cồng kềnh. Đó là một ví dụ điển hình khi nhà phát triển (tôi) cố gắng chuyển các mẫu và cách tiếp cận mà anh ta biết từ khu vực này sang khu vực khác nhưng nó không thực sự hoạt động (trong trường hợp này là các ngôn ngữ mẫu khác).
Nếu bạn cần một yếu tố có điều kiện, hãy làm như thế này:
render: function () {
return (
<div id="page">
{this.state.banner &&
<div id="banner">{this.state.banner}</div>}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
Nếu bạn cũng cần nhánh khác, chỉ cần sử dụng toán tử ternary:
{this.state.banner ?
<div id="banner">{this.state.banner}</div> :
<div>There is no banner!</div>
}
Đó là cách ngắn hơn, thanh lịch hơn và an toàn. Tôi sử dụng nó mọi lúc. Nhược điểm duy nhất là bạn không thể thực hiện else if
phân nhánh dễ dàng nhưng điều đó thường không phổ biến.
Dù sao, điều này là có thể nhờ vào cách các toán tử logic trong JavaScript hoạt động. Các toán tử logic thậm chí cho phép các thủ thuật nhỏ như thế này:
<h3>{this.state.banner.title || 'Default banner title'}</h3>
else
chi nhánh, nó có hoạt động không? Tôi không quen thuộc với jsx ...