Условный рендеринг — это мощная функция React, которая позволяет разработчикам отображать компоненты на основе определенных условий.

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

В этом подробном руководстве мы углубимся в условный рендеринг в React, охватив базовые и продвинутые методы с примерами для правильного понимания.

Понимание условного рендеринга в React

Условный рендеринг в React позволяет разработчикам динамически контролировать, какой контент отображается на экране, на основе определенных значений, которые могут храниться в переменной, состоянии или свойствах.

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

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

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

Сеть развивается, и ваш пользовательский интерфейс тоже должен развиваться! Упростите работу пользователей с помощью динамических адаптивных интерфейсов. Начните здесь 👇Нажмите, чтобы твитнуть

Основные методы условного рендеринга

Есть несколько основных методов, которые вы можете использовать для условного рендеринга в React. Давайте подробно рассмотрим каждый из них.

Использование оператора if для условного рендеринга

Один из самых простых способов реализовать условный рендеринг в React — использовать традиционный if заявление.

if (condition) {
    return <p>Expression 1</p>;
  } else {
    return <p>Expression 2</p>;
  }

JavaScript if оператор может использоваться внутри вашего компонента render() метод для условного отображения содержимого на основе определенного условия.

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

import { useState, useEffect } from 'react';
import Spinner from './Spinner';

const MyComponent = () => {
  const [isLoading, setIsLoading] = useState(true);
  const [data, setData] = useState(null);

  useEffect(() => {
    // Fetch data from an API
    fetch('https://example.com/data')
      .then((response) => response.json())
      .then((data) => {
        setData(data);
        setIsLoading(false);
      });
  }, []);

  if (isLoading) {
    return <Spinner />;
  }

  return <div>{/* Render the data here */}</div>;
};

export default MyComponent;

В этом примере MyComponent извлекает данные из API с помощью useEffect крюк. В ожидании загрузки данных мы отображаем компонент Spinner с помощью if заявление.

Другим примером может быть рендеринг резервного пользовательского интерфейса, когда возникает ошибка при рендеринге вашего компонента:

const MyComponent = ({ data }) => {
  if (!data) {
    return <p>Something went wrong. Please try again later.</p>;
  }

  return <div>{/* Render the data here */}</div>;
};

export default MyComponent;

В этом коде у нас есть MyComponent это занимает data опора Если data prop является ложным, мы отображаем сообщение об ошибке, используя if заявление.

Наконец, вы можете отображать различный контент для разных ролей пользователей с помощью if заявление:

const MyComponent = ({ user }) => {
  if (user.role === 'admin') {
    return <p>Welcome, admin!</p>;
  } else if (user.role === 'user') {
    return <p>Welcome, user!</p>;
  } else {
    return <p>You are not authorized to access this page.</p>;
  }
};

export default MyComponent;

В этом коде у нас есть MyComponent это занимает user опора В зависимости от user.role свойство, мы отображаем различный контент, используя if заявление.

Использование тернарного оператора для условного рендеринга

Еще один лаконичный способ реализации условного рендеринга в React — использование тернарного оператора (?) внутри JSX.

Тернарный оператор позволяет вам написать компактный встроенный оператор if-else, указав 3 операнда. Первый операнд — это условие, а два других операнда — это выражения. Если условие true, будет выполнено первое выражение; в противном случае второе выражение.

Например, вы можете визуализировать различные компоненты на основе реквизита:

import ComponentA from './ComponentA';
import ComponentB from './ComponentB';

const ExampleComponent = ({ shouldRenderComponentA }) => {
  return (
    <div>
      {shouldRenderComponentA ? <ComponentA /> : <ComponentB />}
    </div>
  );
};

export default ExampleComponent;

В этом коде у нас есть ExampleComponent который принимает реквизит, называемый shouldRenderComponentA. Мы используем тернарный оператор для условного рендеринга либо ComponentA или ComponentB на основе стоимости реквизита.

Вы также можете отображать другой текст в зависимости от состояния:

import { useState } from 'react';

const ExampleComponent = () => {
  const [showMessage, setShowMessage] = useState(false);

  return (
    <div>
      <button onClick={() => setShowMessage(!showMessage)}>
        {showMessage ? 'Hide message' : 'Show message'}
      </button>
      {showMessage ? <p>Hello, world!</p> : null}
    </div>
  );
};

export default ExampleComponent;

В этом примере мы используем тернарный оператор для условного отображения разного текста в зависимости от значения параметра showMessage состояние. При нажатии на кнопку значение showMessage переключается, и текст отображается или скрывается соответственно.

Наконец, вы можете визуализировать счетчик загрузки во время выборки данных:

import { useState, useEffect } from 'react';
import Spinner from './Spinner';

const ExampleComponent = () => {
  const [isLoading, setIsLoading] = useState(true);
  const [data, setData] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      const response = await fetch('https://jsonplaceholder.typicode.com/todos/1');
      const jsonData = await response.json();
      setData(jsonData);
      setIsLoading(false);
    };
    fetchData();
  }, []);

  return (
    <div>
      {isLoading ? <Spinner /> : <p>{data.title}</p>}
    </div>
  );
};

export default ExampleComponent;

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

Использование логических операторов И и ИЛИ для условного рендеринга

Вы также можете использовать логическое И (&&) и ИЛИ (||) для реализации условного рендеринга в React.

Логический оператор И позволяет отображать компонент, только если выполняется определенное условие, а логический оператор ИЛИ позволяет отображать компонент, если выполняется одно из условий.

Эти операторы полезны, когда у вас есть простые условия, определяющие, должен ли компонент визуализироваться или нет. Например, если вы хотите отображать кнопку только в том случае, если форма действительна, вы можете использовать логический оператор И следующим образом:

import { useState } from 'react';

const FormComponent = () => {
  const [formValues, setFormValues] = useState({ username: "", password: "" });

  const isFormValid = formValues.username && formValues.password;

  const handleSubmit = (event) => {
    event.preventDefault();
    // Submit form data
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        value={formValues.username}
        placeholder="Type Username..."
        onChange={(e) =>
          setFormValues({ ...formValues, username: e.target.value })
        }
      />
      <br />
      <input
        type="password"
        value={formValues.password}
        placeholder="Type Password..."
        onChange={(e) =>
          setFormValues({ ...formValues, password: e.target.value })
        }
      />
      {isFormValid && <button type="submit">Submit</button>}
    </form>
  );
};

export default FormComponent;

В этом примере у нас есть FormComponent которая имеет форму с двумя полями ввода для username и password. мы используем useState крючок для управления значениями формы и isFormValid переменная, чтобы проверить, имеют ли оба поля ввода значения. Используя логический оператор И (&&), мы отображаем кнопку отправки, только если isFormValid правда. Это гарантирует, что кнопка активна только тогда, когда форма действительна.

Точно так же вы можете использовать оператор OR для отображения сообщения о загрузке, если данные все еще загружаются, или сообщения об ошибке, если произошла ошибка:

import React, { useEffect, useState } from 'react';

const DataComponent = () => {
  const [data, setData] = useState(null);
  const [isLoading, setIsLoading] = useState(true);
  const [errorMessage, setErrorMessage] = useState('');

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch('https://api.example.com/data');
        const data = await response.json();
        setData(data);
      } catch (error) {
        setErrorMessage('An error occurred while fetching data.');
      } finally {
        setIsLoading(false);
      }
    };

    fetchData();
  }, []);

  return (
    <>
      {errorMessage || isLoading ? (
        <p>{errorMessage || 'Loading...'}</p>
      ) : (
        <ul>
          {data.map((item) => (
            <li key={item.id}>{item.name}</li>
          ))}
        </ul>
      )}
    </>
  );
};

export default DataComponent;

В этом примере DataComponent извлекает данные из API с помощью fetch и отображает их в списке. мы используем useState hook для управления данными, состоянием загрузки и сообщением об ошибке. Используя логический оператор ИЛИ (||), мы можем отобразить сообщение о загрузке или сообщение об ошибке, если одно из его условий истинно. Это гарантирует, что пользователь увидит сообщение, указывающее текущее состояние процесса выборки данных.

Использование логических операторов И и ИЛИ для условного рендеринга в React — это краткий и удобочитаемый способ обработки простых условий. Однако лучше использовать другие подходы, такие как switch утверждения для более сложной логики.

Расширенные методы условного рендеринга

Условный рендеринг в React может быть более сложным в зависимости от требований вашего приложения. Вот несколько продвинутых методов, которые можно использовать для условного рендеринга в более сложных сценариях.

Использование операторов Switch для условного рендеринга

В то время как операторы if и тернарные операторы являются обычными подходами для условного рендеринга, иногда switch может быть более подходящим, особенно при работе с несколькими условиями.

Вот пример:

import React from 'react';
const MyComponent = ({ userType }) => {
  switch (userType) {
    case 'admin':
      return <p>Welcome, admin user!</p>;
    case 'user':
      return <p>Welcome, regular user!</p>;
    default:
      return <p>Please log in to continue.</p>;
  }
};
export default MyComponent;

В этом коде switch Оператор используется для отображения содержимого на основе userType опора условно. Этот подход может быть полезен при работе с несколькими условиями и обеспечивает более организованный и читаемый способ обработки сложной логики.

Условный рендеринг с React Router

React Router — популярная библиотека для обработки маршрутизации на стороне клиента в приложениях React. React Router позволяет условно отображать компоненты на основе текущего маршрута.

Вот пример реализации условного рендеринга с использованием React Router:

import { useState } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

import Home from './components/Home';
import Login from './components/Login';
import Dashboard from './components/Dashboard';
import NotFound from './components/NotFound';

const App = () => {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/login">
          <Login setIsLoggedIn={setIsLoggedIn} />
        </Route>
        {isLoggedIn ? (
          <Route path="/dashboard" component={Dashboard} />
        ) : (
          <Route component={NotFound} />
        )}
      </Switch>
    </Router>
  );
};

export default App;

В этом коде мы используем isLoggedIn состояние для условного отображения либо Dashboard компонент, если пользователь вошел в систему, или NotFound компонент, если пользователь не вошел в систему. Login компонент устанавливает isLoggedIn состояние true как только пользователь успешно войдет в систему.

Обратите внимание, что мы используем <Route> дочерняя поддержка компонента для передачи в Login компонент и setIsLoggedIn функция. Это позволяет нам передавать реквизиты в Login компонент, не указывая его в path опора

Из этого руководства вы узнаете, как визуализировать гибкие пользовательские интерфейсы и адаптивные макеты в React. Проверьте это! 💡Нажмите, чтобы твитнуть

Краткое содержание

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

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

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

Ищете идеальное хостинговое решение для ваших приложений React? Попробуйте хостинг приложений Kinsta бесплатно!