React.js на русском языке. Часть седьмая

97ab1c1280aa452c918b8aa9a77e2fae.png
Перевод официальной документации библиотеки React.js на русском языке.

Оглавление:


1 — Часть первая — Установка
2 — Часть вторая — Внедрение JSX
3 — Часть третья — Отрисовка элементов
4 — Часть четвертая — Компоненты и свойства
5 — Часть пятая — Состояние и жизненный цикл
6 — Часть шестая — Обработка событий
7 — Часть седьмая — Условный рендеринг
8 — Часть восьмая (скоро)Условный рендеринг
В React вы можете создавать отдельные компоненты, которые воплощают нужную вам модель поведения. Затем можно будет отобразить только некоторые из них, в зависимости от состояния приложения.

Условный рендеринг в React работает точно так же, как и в JavaScript. Используйте операторы JavaScript, как »if» или условный оператор для создания элементов, которые отображают текущее состояние, и чтобы позволить React обновлять пользовательский интерфейс, чтобы им соответствовать.

Рассмотрим данные составляющие:

function UserGreeting(props) {
  return 

Welcome back!

; } function GuestGreeting(props) { return

Please sign up.

; }

Мы создадим отельный компонент, который будет отображать оба вышеуказанных компонента в зависимости от того, вошел ли пользователь в систему:
function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {
    return ;
  }
  return ;
}

ReactDOM.render(
  // Try changing to isLoggedIn={true}:
  ,
  document.getElementById('root')
);

Попробуйте на CodePen.

Данный пример отображает различные приветствия в зависимости от значения опоры isLoggedIn.

Элемент переменных


Вы можете использовать переменные для хранения элементов. Это может помочь вам условно вынести часть компонента, в то время как остальные выходные данные не изменятся.

Рассмотрим два новых компонента, представляющие кнопки Входа и Выхода:

function LoginButton(props) {
  return (
    
  );
}

function LogoutButton(props) {
  return (
    
  );
}

В приведенном ниже примере, мы создадим компонент состояния, который называется »LoginControl». Он будет отображать либо »LoginButton», либо »LogoutButton» в зависимости от текущего состояния. Он также отобразит »Greeting» из предыдущего примера:
class LoginControl extends React.Component {
  constructor(props) {
    super(props);
    this.handleLoginClick = this.handleLoginClick.bind(this);
    this.handleLogoutClick = this.handleLogoutClick.bind(this);
    this.state = {isLoggedIn: false};
  }

  handleLoginClick() {
    this.setState({isLoggedIn: true});
  }

  handleLogoutClick() {
    this.setState({isLoggedIn: false});
  }

  render() {
    const isLoggedIn = this.state.isLoggedIn;

    let button = null;
    if (isLoggedIn) {
      button = ;
    } else {
      button = ;
    }

    return (
      
{button}
); } } ReactDOM.render( , document.getElementById('root') );

Попробуйте на CodePen.

Ввод переменной и оператора »if» — отличный способ для условного отображения компонента, но, возможно, вы захотите использовать более короткий синтаксис. Ниже представлены несколько способов как встроить условия в JSX.

Как встроить «If» с помощью логического оператора (&&)


Вы можете встроить любые выражения в JSX путем заключения их в фигурные скобки. Это включает логический оператор (&&) JavaScript. Это может быть удобно для условной вставки элемента:
function Mailbox(props) {
  const unreadMessages = props.unreadMessages;
  return (
    

Hello!

{unreadMessages.length > 0 &&

You have {unreadMessages.length} unread messages.

}
); } const messages = ['React', 'Re: React', 'Re:Re: React']; ReactDOM.render( , document.getElementById('root') );

Попробуйте на CodePen.

Это работает, потому что в JavaScript «true && expression» всегда определяет »expression», а »false && expression» всегда определяет »false». Поэтому, если условие »True», то на выходе появится элемент, который был после &&. Если условие »false», то React проигнорирует и пропустит его.

Как встроить «If-Else» с помощью условного оператора


Другой способ для условного ввода отображающихся элементов -использование условного оператора «condition? true: false» в JavaScript. В приведенном ниже примере, мы используем его для того, чтобы условно отобразить небольшую часть текста.
render() {
  const isLoggedIn = this.state.isLoggedIn;
  return (
    
The user is {isLoggedIn ? 'currently' : 'not'} logged in.
); } It can also be used for larger expressions although it is less obvious what's going on: render() { const isLoggedIn = this.state.isLoggedIn; return (
{isLoggedIn ? ( ) : ( )}
); }

Как и в JavaScript выбор стиля текста полностью зависит от вас. Также помните, что если условия становятся слишком сложными, можно извлечь тот или иной компонент.

Как уберечь компонент от рендеринга


В редких случаях может потребоваться спрятать компонент, даже если он был отображен другим компонентом. Для этого верните »null» вместо его выходных данных. В приведенном ниже примере компонент »WarningBanner» отображается в зависимости от значения флага, в данном случае »warn». Если значение флага »false», то компонент не отображается.
function WarningBanner(props) {
  if (!props.warn) {
    return null;
  }

  return (
    
Warning!
); } class Page extends React.Component { constructor(props) { super(props); this.state = {showWarning: true} this.handleToggleClick = this.handleToggleClick.bind(this); } handleToggleClick() { this.setState(prevState => ({ showWarning: !prevState.showWarning })); } render() { return (
); } } ReactDOM.render( , document.getElementById('root') );

Попробуйте на CodePen.

Комментарии (1)

  • 5 декабря 2016 в 23:49

    0

    «Попробуйте на CodePen.»

    Если что, Хабр уже несколько месяцев поддерживает вставку oembed, в том числе с codepen)

© Habrahabr.ru