6 способов реализовать CR в React.js

Условный рендеринг кажется стандартным вопросом для проблем с кодом. Я помню, когда получил его на тесте. На самом деле я был приятно удивлен. Ну кто не умеет пользоваться условным рендерингом. Но сколько способов вы знаете?

Условный рендеринг в языке React - это способ рендеринга различных элементов или компонентов в зависимости от условия. Эта концепция часто применяется в следующих сценариях:

  • Отображение внешних данных из API
  • Отображение / скрытие элементов
  • Переключение функций приложения
  • Реализация уровней разрешений
  • Аутентификация и авторизация

На простом примере, основанном на значении isLoggedIn в состоянии компонента, мы хотим иметь возможность отображать кнопку входа в систему, если пользователь не вошел в систему, и Logout другим способом.

import React, { Component } from "react";
import ReactDOM from "react-dom";
import "./styles.css";
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      isLoggedIn: true
    };
  }
  render() {
    return (
      <div className="App">
        <h1>
          This is a Demo showing several ways to implement Conditional Rendering
          in React.
        </h1>
     <button>Login</button>
      <button>Logout</button>
      </div>
    );
  }
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

⚫ Если / иначе Статус

Оператор if/else позволяет нам указать, что конкретное действие будет происходить только при условии true, а также сделать что-то еще, если этого не произойдет.

// index.js
...
render() {
    let {isLoggedIn} = this.state;
    const renderAuthButton = ()=>{
      if(isLoggedIn){
        return <button>Logout</button>
      } else{
        return <button>Login</button>
      }
    }
    return (
      <div className="App">
        <h1>
          This is a Demo showing several ways to implement Conditional Rendering
          in React.
        </h1>
        {renderAuthButton()}
      </div>
    );
  }
...

Множественные операторы возврата

В этом методе важно, чтобы компонент был простым. Для этого создадим еще один функциональный компонент под названием AuthButton:

// AuthButton.js
import React from "react";
const AuthButton = props => {
  let { isLoggedIn } = props;
  if (isLoggedIn) {
    return <button>Logout</button>;
  } else {
    return <button>Login</button>;
  }
};
export default AuthButton;

AuthButton возвращает различные элементы в зависимости от значения состояния, которое передается через свойства isLoggedIn. Таким образом, мы импортируем его в наш index.js и передаем соответствующее состояние, как показано ниже:

// index.js
...
import AuthButton from "./AuthButton";
...
  render() {
    let { isLoggedIn } = this.state;
    return (
      <div className="App">
      ...
        <AuthButton isLoggedIn={isLoggedIn} />
      </div>
    );
  }
...

⚫ Использование переменных элемента

// index.js
...
render() {
    let { isLoggedIn } = this.state;
    let AuthButton;
    if (isLoggedIn) {
      AuthButton = <button>Logout</button>;
    } else {
      AuthButton = <button>Login</button>;
    }
    return (
      <div className="App">
        <h1>
          This is a Demo showing several ways to implement Conditional Rendering
          in React.
        </h1>
        {AuthButton}
      </div>
    );
  }
...

Как видите, мы условно присваиваем значения (компоненты) AuthButton, а затем нам нужно только аккуратно отрендерить его в нашем JSX.

⚫ Использование оператора Switch

Мы можем условно вернуть разную разметку из компонентов, используя оператор switch, где мы можем указать разметку для различных условий.

// AuthButton.js
import React from "react";
const AuthButton = props => {
  let { isLoggedIn } = props;
  switch (isLoggedIn) {
    case true:
      return <button>Logout</button>;
      break;
    case false:
      return <button>Login</button>;
      break;
    default:
      return null;
  }
};
export default AuthButton;

Это более разумно использовать, когда существует более двух возможных исходов.

⚫ Тернарные операторы

Страшно звучит? Не беспокойтесь, вы видели это раньше, обещаю! Условный (тернарный) оператор - единственный оператор JavaScript, который принимает три операнда. Этот оператор часто используется как ярлык для оператора if. Я не знала, как мы это называем.

// index.js
...
render() {
    let { isLoggedIn } = this.state;
    return (
      <div className="App">
        <h1>
          This is a Demo showing several ways to implement Conditional Rendering
          in React.
        </h1>
        {isLoggedIn ? <button>Logout</button> : <button>Login</button>}
      </div>
    );
  }
...

⚫ Логический &&

Оценка короткого замыкания (так называется методика) - это метод, используемый для обеспечения отсутствия побочных эффектов во время оценки операндов в выражении.

// index.js
...
render() {
    let { isLoggedIn } = this.state;
    return (
      <div className="App">
        <h1>
          This is a Demo showing several ways to implement Conditional Rendering
          in React.
        </h1>
        {isLoggedIn && <button>Logout</button>}
      </div>
    );
  }
...

Логический && позволяет нам указать, что действие должно выполняться только тогда, когда условие истинно, в противном случае оно будет полностью проигнорировано. Это полезно в ситуациях, когда нам нужно выполнить какое-либо действие только при одном условии.

⚫ Использование IIFE

IIFE (я немедленно я вызвал F функцию E сжатие) - это JavaScript. функция, которая запускается, как только она определена. Подробнее здесь.

//index.js
...
render() {
    let { isLoggedIn } = this.state;
    return (
      <div className="App">
        <h1>
          This is a Demo showing several ways to implement Conditional Rendering
          in React.
        </h1>
        {(function() {
          if (isLoggedIn) {
            return <button>Logout</button>;
          } else {
            return <button>Login</button>;
          }
        })()}
      </div>
    );
  }
...

В этом методе мы используем анонимную функцию, которая немедленно вызывается при оценке этой части кода.