Как дополнительно включить элемент в JSX? Вот пример использования баннера, который должен быть в компоненте, если он был передан. Чего я хочу избежать, так это дублирования HTML-тегов в операторе if.
render: function () {
var banner;
if (this.state.banner) {
banner = <div id="banner">{this.state.banner}</div>;
} else {
banner = ?????
}
return (
<div id="page">
{banner}
<div id="other-content">
blah blah blah...
</div>
</div>
);
}
javascript
reactjs
react-jsx
Джек Аллан
источник
источник
else
ветки, это работает? Я не знаком с JSX ...Ответы:
Просто оставьте баннер как неопределенный, и он не будет включен.
источник
null
так же хорошо, какundefined
? Также это та часть спецификации, что она работает таким образом и, следовательно, вряд ли сломается в будущем?Как насчет этого. Давайте определим простой вспомогательный
If
компонент.И используйте это так:
ОБНОВЛЕНИЕ: Поскольку мой ответ становится популярным, я чувствую себя обязанным предупредить вас о самой большой опасности, связанной с этим решением. Как указано в другом ответе, код внутри
<If />
компонента выполняется всегда независимо от того, является ли условие истинным или ложным. Поэтому в следующем примере произойдет сбой в случае, еслиbanner
естьnull
(обратите внимание на доступ к свойству во второй строке):Вы должны быть осторожны, когда используете его. Я предлагаю прочитать другие ответы для альтернативных (более безопасных) подходов.
ОБНОВЛЕНИЕ 2: Оглядываясь назад, этот подход не только опасен, но и крайне обременителен. Это типичный пример того, когда разработчик (я) пытается перенести известные ему шаблоны и подходы из одной области в другую, но на самом деле это не работает (в данном случае другие языки шаблонов).
Если вам нужен условный элемент, сделайте это так:
Если вам также нужна ветвь else, просто используйте троичный оператор:
Это намного короче, элегантнее и безопаснее. Я использую это все время. Единственным недостатком является то, что вы не можете делать
else if
это легко, но обычно это не так часто.В любом случае, это возможно благодаря тому, как работают логические операторы в JavaScript. Логические операторы даже допускают такие маленькие хитрости:
источник
ReactElement
<span>
или<div>
.Лично я действительно считаю, что троичные выражения, показанные в ( JSX In Depth ), являются наиболее естественным способом, который соответствует стандартам ReactJs.
Смотрите следующий пример. Это немного грязно на первый взгляд, но работает довольно хорошо.
источник
Вы также можете написать это как
Если
state.banner
этоnull
илиundefined
, правая часть условия будет пропущена.источник
Компонент
If
стиля опасен, потому что блок кода всегда выполняется независимо от условия. Например, это может вызвать исключение нулевой , еслиbanner
этоnull
:Другой вариант - использовать встроенную функцию (особенно полезно с другими инструкциями):
Еще один вариант из реагирующих вопросов :
источник
&& + стиль кода + небольшие компоненты
Этот простой тестовый синтаксис + соглашение в стиле кода + небольшие ориентированные компоненты - для меня наиболее читаемый вариант. Вам просто нужно позаботиться о ложных значениях, таких как
false
,0
или""
.сделать запись
Синтаксис нотации ES7 stage-0 do do также очень хорош, и я буду использовать его, когда моя среда IDE правильно его поддерживает:
Подробнее здесь: ReactJs - Создание компонента «Если» ... хорошая идея?
источник
short-circuit syntax
Просто создайте функцию.
Это шаблон, которому я лично следую все время. Делает код действительно чистым и легким для понимания. Более того, он позволяет вам выполнить рефакторинг
Banner
в свой собственный компонент, если он становится слишком большим (или повторно используется в других местах).источник
Экспериментальный
do
синтаксис ES7 делает это легко. Если вы используете Babel, включите этуes7.doExpressions
функцию:Смотрите http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions
источник
Как уже упоминалось в ответах, JSX предоставляет вам два варианта
Тернарный оператор
{ this.state.price ? <div>{this.state.price}</div> : null }
Логическое соединение
{ this.state.price && <div>{this.state.price}</div> }
Тем не менее, они не работают для
price == 0
.JSX отобразит ложную ветвь в первом случае, и в случае логического соединения ничего не будет отображено. Если свойство может быть 0, просто используйте операторы if вне вашего JSX.
источник
typeof(this.state.price) === "number"
в качестве условия (в любом варианте).Этот компонент работает, когда у вас есть более одного элемента внутри ветви "if":
Использование:
PS Кто-то считает, что эти компоненты не годятся для чтения кода. Но на мой взгляд, HTML с JavaScript хуже
источник
Большинство примеров с одной строкой «html», которая отображается условно. Это кажется читаемым для меня, когда у меня есть несколько строк, которые должны быть отображены условно.
Первый пример хорош, потому что вместо того,
null
чтобы условно отображать какой-то другой контент, такой как{this.props.showContent ? content : otherContent}
Но если вам просто нужно показать / скрыть контент, это еще лучше, так как булевы, нулевые и неопределенные игнорируются
источник
Есть другое решение, если компонент для React :
источник
Я использую более явный ярлык: выражение немедленного вызова функции (IIFE):
источник
Я сделал https://www.npmjs.com/package/jsx-control-statements , чтобы сделать его немного легче, в основном это позволяет определить
<If>
условный как теги , а затем компилирует их в трехкомпонентный МФС , так что код внутри<If>
только получает выполняется, если условие истинно.источник
Существует также действительно чистая однострочная версия ... {this.props.product.title || "Без названия" }
То есть:
источник
Я недавно сделал https://github.com/ajwhite/render-if, чтобы безопасно отображать элементы, только если предикат прошел .
или
источник
Вы можете условно включить элементы, используя троичный оператор, например так:
источник
Вы можете использовать функцию и вернуть компонент и сохранить функцию визуализации
источник
Вот мой подход с использованием ES6.
Демо: http://jsfiddle.net/kb3gN/16688/
Я использую код как:
Это будет отображаться,
SomeElement
только еслиopened
это правда. Это работает из-за способа, которым JavaScript разрешает логические условия:Как
React
будет игнорироватьfalse
, я нахожу это очень хорошим способом условного рендеринга некоторых элементов.источник
Может быть, это поможет кому-то, кто сталкивается с вопросом: все условные рендеры в React Это статья обо всех различных вариантах условного рендеринга в React.
Основные выводы о том, когда использовать какой условный рендеринг:
** если еще
** троичный оператор
** логический && оператор
** корпус переключателя
** перечисления
** многоуровневая / вложенная условная визуализация
** HOCs
** внешние шаблонные компоненты
источник
С ES6 вы можете сделать это с простым однострочником
"show" - логическое значение, и вы используете этот класс
источник
Я не думаю, что это было упомянуто. Это как твой собственный ответ, но я думаю, что это еще проще. Вы всегда можете возвращать строки из выражений и вкладывать jsx в выражения, что позволяет легко читать встроенные выражения.
источник
Я как эксплицитность немедленно вызываемых функциональных выражений (
IIFE
) иif-else
надrender callbacks
иternary operators
.Вам просто нужно познакомиться с
IIFE
синтаксисом,{expression}
это обычный синтаксис React, внутри него просто учтите, что вы пишете функцию, которая вызывает себя.которые должны быть обернуты внутри Parens
источник
Существует также методика использования реквизита рендера для условного рендеринга компонента. Преимущество состоит в том, что визуализация не будет оцениваться до тех пор, пока не будет выполнено условие, что не будет беспокоиться о нулевых и неопределенных значениях.
источник
Когда нужно что-то визуализировать, если переданное условие выполнено, вы можете использовать синтаксис:
Код таким образом будет выглядеть так:
Есть, конечно, другие действительные способы сделать это, все зависит от предпочтений и поводов. В этой статье вы можете узнать больше о том, как сделать условный рендеринг в React, если вам интересно!
источник
Просто чтобы добавить еще одну опцию - если вам нравится / терпит coffee-script, вы можете использовать coffee-реагировать для написания вашего JSX, и в этом случае можно использовать операторы / else, поскольку они являются выражениями в coffee-script, а не операторами:
источник
Просто чтобы расширить @Jack Аллан ответ со ссылками на документы.
Реагировать на базовую (Quick Start) документацию предлагает
null
в таком случае. Однако, Booleans, Null и Undefined также игнорируются , упомянутые в Расширенном руководстве.источник