Как насчет этого. Давайте определим простой вспомогательный 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>
);
}
Если вам также нужна ветвь else, просто используйте троичный оператор:
{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 ...