Условный рендеринг¶
React позволяет разделить логику на независимые компоненты. Эти компоненты можно показывать или прятать в зависимости от текущего состояния.
Условный рендеринг в React работает так же, как условные выражения работают в JavaScript. Бывает нужно объяснить React, как состояние влияет на то, какие компоненты требуется скрыть, а какие — отрендерить, и как именно. В таких ситуациях используйте условный оператор JavaScript или выражения подобные if
.
Рассмотрим два компонента:
1 2 3 4 5 6 7 |
|
Можно создать компонент Greeting
, который отражает один из этих компонентов в зависимости от того, на сайте пользователь или нет:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
В этом примере рендерится различное приветствие в зависимости от значения пропа isLoggedIn
.
Переменные-элементы¶
Элементы React можно сохранять в переменных. Это может быть удобно, когда какое-то условие определяет, надо ли рендерить одну часть компонента или нет, а другая часть компонента остаётся неизменной.
Рассмотрим ещё два компонента, представляющих кнопки Войти (Login) и Выйти (Logout).
1 2 3 4 5 6 7 |
|
В следующем примере мы создадим компонент с состоянием и назовём его LoginControl
.
Он будет рендерить либо <LoginButton />
, либо <LogoutButton />
в зависимости от текущего состояния. А ещё он будет всегда рендерить <Greeting />
из предыдущего примера.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
|
Нет ничего плохого в том, чтобы объявить переменную и условно рендерить компонент if
-выражением. Но иногда хочется синтаксис покороче. Давайте посмотрим на несколько других способов писать условия прямо в JSX.
Встроенные условия if с логическим оператором &&¶
Вы можете внедрить любое выражение в JSX, заключив его в фигурные скобки. Это правило распространяется и на логический оператор &&
языка JavaScript, которым можно удобно вставить элемент в зависимости от условия:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Приведённый выше вариант работает корректно, потому что в JavaScript выражение true && expression
всегда вычисляется как expression
, а выражение false && expression
— как false
.
То есть, если условие истинно (true
), то элемент, идущий непосредственно за &&
, будет передан на вывод. Если же оно ложно (false
), то React проигнорирует и пропустит его.
Встроенные условия if-else с тернарным оператором¶
Есть ещё один способ писать условия прямо в JSX. Вы можете воспользоваться тернарным оператором condition ? true : false
.
Вот как этот метод можно использовать, чтобы отрендерить кусочек текста.
1 2 3 4 5 6 7 8 |
|
Этот метод можно использовать и с выражениями покрупнее, но это может сделать код менее очевидным:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Как в JavaScript, так и в React выбор синтаксиса зависит от ваших предпочтений и принятого в команде стиля. Не забывайте, что если какое-то условие выглядит очень сложным, возможно пришло время извлечь часть кода в отдельный компонент.
Предотвращение рендеринга компонента¶
В редких случаях может потребоваться позволить компоненту спрятать себя, хотя он уже и отрендерен другим компонентом. Чтобы этого добиться, верните null
вместо того, что обычно возвращается на рендеринг.
Например, будет ли содержимое <WarningBanner />
отрендерено, зависит от значения пропа под именем warn
. Если значение false
, компонент ничего не рендерит:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
Сам факт возврата null
из метода render
компонента никак не влияет на срабатывание методов жизненного цикла компонента. Например, componentDidUpdate
будет всё равно вызван.