Як що до цього. Давайте визначимо простий If
компонент допомоги .
var If = React.createClass({
render: function() {
if (this.props.test) {
return this.props.children;
}
else {
return false;
}
}
});
І використовувати це так:
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>
);
}
ОНОВЛЕННЯ: Оскільки моя відповідь стає популярною, я відчуваю, що я зобов’язаний попередити вас про найбільшу небезпеку, пов'язану з цим рішенням. Як вказувалося в іншій відповіді, код всередині <If />
компонента виконується завжди незалежно від того, чи умова істинна чи помилкова. Тому наступний приклад не вдасться у випадку, якщо banner
є null
(зверніть увагу на доступ до властивостей у другому рядку):
<If test={this.state.banner}>
<div id="banner">{this.state.banner.url}</div>
</If>
Ви повинні бути обережними, коли ним користуєтесь. Я пропоную прочитати інші відповіді щодо альтернативних (безпечніших) підходів.
ОНОВЛЕННЯ 2: Озираючись назад, цей підхід є не лише небезпечним, але й відчайдушно громіздким. Це типовий приклад того, коли розробник (я) намагається передати шаблони та підходи, які він знає, з однієї області в іншу, але це насправді не працює (в цьому випадку інші мови шаблонів).
Якщо вам потрібен умовний елемент, зробіть це так:
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>
);
}
Якщо вам також потрібна інша галузь, просто скористайтеся потрійним оператором:
{this.state.banner ?
<div id="banner">{this.state.banner}</div> :
<div>There is no banner!</div>
}
Це коротше, елегантніше та безпечніше. Я ним користуюся постійно. Єдиним недоліком є те, що ви не можете виконати else if
розгалуження так легко, але зазвичай це не так часто.
У будь-якому випадку це можливо завдяки тому, як працюють логічні оператори в JavaScript. Логічні оператори навіть дозволяють такі маленькі хитрощі:
<h3>{this.state.banner.title || 'Default banner title'}</h3>
else
філії, це працює? Я не знайомий з jsx ...