Il rendering condizionale è una potente funzionalità di React che consente agli sviluppatori di eseguire il rendering dei componenti in base a determinate condizioni.

È un concetto fondamentale che gioca un ruolo cruciale nella costruzione di applicazioni web dinamiche e interattive.

In questa guida completa, ci addentreremo in profondità nel rendering condizionale in React, trattando le tecniche di base e avanzate con esempi per una corretta comprensione.

Capire il rendering condizionale in React

Il rendering condizionale in React consente agli sviluppatori di controllare dinamicamente i contenuti visualizzati sullo schermo in base a valori specifici che possono essere memorizzati in una variabile, uno stato o un oggetto.

Questo può essere estremamente utile in scenari in cui si desidera mostrare o nascondere determinati elementi dell’interfaccia utente, modificare il layout di una pagina o visualizzare contenuti diversi in base alle interazioni dell’utente.

Il rendering condizionale è importante nelle applicazioni React perché permette di creare interfacce utente dinamiche e interattive in grado di rispondere ai dati e alle interazioni degli utenti in tempo reale.

Contribuisce a migliorare le prestazioni e l’efficienza delle applicazioni evitando il rendering inutile di componenti o elementi non necessari.

Il web è in continua evoluzione e anche la tua interfaccia utente dovrebbe esserlo! Agevola gli utenti con interfacce dinamiche e adattive. Inizia qui 👇 Clicca per twittare

Tecniche di base per il rendering condizionale

Ci sono diverse tecniche di base che puoi utilizzare per il rendering condizionale in React. Esploriamo ciascuna di esse in dettaglio.

Usare l’istruzione if per il rendering condizionale

Uno dei modi più semplici per implementare il rendering condizionale in React è l’utilizzo della tradizionale istruzione if.

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

L’istruzione if di JavaScript può essere utilizzata all’interno del metodo render() del componente per eseguire il rendering condizionale dei contenuti in base a una determinata condizione.

Ad esempio, si può utilizzare l’istruzione if per visualizzare uno spinner di caricamento in attesa del caricamento dei dati:

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;

In questo esempio, MyComponent recupera i dati da un’API utilizzando l’hook useEffect. In attesa del caricamento dei dati, visualizziamo un componente Spinner utilizzando l’istruzione if.

Un altro esempio può essere il rendering di un’interfaccia di fallback quando si verifica un errore durante il rendering del componente:

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;

In questo codice, abbiamo un MyComponent che accetta un data prop. Se il prop data è errato, renderizziamo un messaggio di errore utilizzando l’istruzione if.

Infine, è possibile visualizzare contenuti diversi per diversi ruoli utente con l’istruzione 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;

In questo codice, abbiamo un MyComponent che accetta una proprietà user. A seconda della proprietà user.role, visualizziamo contenuti diversi utilizzando l’istruzione if.

Usare l’operatore ternario per il rendering condizionale

Un altro modo conciso per implementare il rendering condizionale in React è l’utilizzo dell’operatore ternario (?) all’interno di JSX.

L’operatore ternario permette di scrivere un’istruzione inline if-else compatta specificando 3 operandi. Il primo operando è la condizione, mentre gli altri due operandi sono le espressioni. Se la condizione è true, verrà eseguita la prima espressione, altrimenti la seconda.

Ad esempio, è possibile eseguire il rendering di diversi componenti in base a un prop:

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

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

export default ExampleComponent;

In questo codice, abbiamo un ExampleComponent che prende un oggetto chiamato shouldRenderComponentA. Utilizziamo l’operatore ternario per rendere condizionatamente ComponentA o ComponentB in base al valore del prop.

Si può anche rendere un testo diverso in base a uno stato:

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;

In questo esempio, utilizziamo l’operatore ternario per rendere in modo condizionale un testo diverso a seconda del valore dello stato showMessage. Quando il pulsante viene cliccato, il valore di showMessage viene modificato e il testo viene visualizzato o nascosto di conseguenza.

Infine, è possibile visualizzare uno spinner di caricamento mentre i dati vengono recuperati:

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;

In questo esempio, utilizziamo l’operatore ternario per visualizzare in modo condizionale uno spinner di caricamento mentre i dati vengono prelevati da un’API. Una volta che i dati sono disponibili, rendiamo la proprietà title utilizzando l’operatore ternario.

Usare gli operatori logici AND e OR per il rendering condizionale

Potete anche utilizzare gli operatori logici AND (&&) e OR (||) per implementare il rendering condizionale in React.

L’operatore logico AND permette di eseguire il rendering di un componente solo se una certa condizione è vera, mentre l’operatore logico OR permette di eseguire il rendering di un componente se una delle due condizioni è vera.

Questi operatori sono utili quando si hanno delle condizioni semplici che determinano se un componente deve essere renderizzato o meno. Ad esempio, se volete effettuare il rendering di un pulsante solo se un modulo è valido, potete usare l’operatore logico AND in questo modo:

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;

In questo esempio, abbiamo un modulo FormComponent con due campi di input per username e password. Stiamo utilizzando l’hook useState per gestire i valori del modulo e la variabile isFormValid per verificare se entrambi i campi di input hanno un valore. Utilizzando l’operatore logico AND (&&), effettuiamo il rendering del pulsante di invio solo se isFormValid è vero. Questo assicura che il pulsante sia abilitato solo quando il modulo è valido.

Allo stesso modo, potete usare l’operatore OR per visualizzare un messaggio di caricamento se i dati sono ancora in fase di caricamento o un messaggio di errore se si verifica un errore:

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;

In questo esempio, DataComponent recupera i dati da un’API tramite fetch e li visualizza in un elenco. Utilizziamo l’hook useState per gestire i dati, lo stato di caricamento e il messaggio di errore. Utilizzando l’operatore logico OR (||), possiamo visualizzare un messaggio di caricamento o un messaggio di errore se una delle due condizioni è vera. In questo modo l’utente vede un messaggio che indica lo stato attuale del processo di acquisizione dei dati.

L’utilizzo degli operatori logici AND e OR per il rendering condizionale in React è un modo conciso e leggibile per gestire condizioni semplici. Tuttavia, è meglio utilizzare altri approcci come le istruzioni di switch per una logica più complessa.

Tecniche avanzate per il rendering condizionale

Il rendering condizionale in React può essere più complesso a seconda dei requisiti dell’applicazione. Ecco alcune tecniche avanzate che si possono utilizzare per il rendering condizionale in scenari più complessi.

Usare le dichiarazioni Switch per il rendering condizionale

Sebbene le istruzioni if e gli operatori ternari siano approcci comuni per il rendering condizionale, a volte un’istruzione switch può essere più appropriata, soprattutto quando si tratta di condizioni multiple.

Ecco un esempio:

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;

In questo codice, viene utilizzata un’istruzione switch per eseguire il rendering condizionale dei contenuti in base alla proprietà userType. Questo approccio può essere utile quando si tratta di condizioni multiple e fornisce un modo più organizzato e leggibile per gestire una logica complessa.

Rendering condizionale con React Router

React Router è una libreria popolare per gestire il routing lato client nelle applicazioni React. React Router permette di eseguire il rendering condizionato dei componenti in base al percorso corrente.

Ecco un esempio di implementazione del rendering condizionale con 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;

In questo codice, utilizziamo lo stato isLoggedIn per renderizzare in modo condizionale il componente Dashboard se l’utente ha effettuato l’accesso, oppure il componente NotFound se l’utente non ha effettuato l’accesso. Il componente Login imposta lo stato isLoggedIn su true una volta che l’utente ha effettuato l’accesso.

Notate che stiamo usando il prop child del componente <Route> per passare il componente Login e la funzione setIsLoggedIn. Questo ci permette di passare gli oggetti di scena al componente Login senza specificarli nel prop path.

Scopri come rendere flessibili le interfacce utente e i layout adattivi in React con questa guida. Dai un'occhiata! 💡 Clicca per twittare

Riepilogo

Il rendering condizionale è una tecnica potente di React che permette di aggiornare dinamicamente l’interfaccia utente in base a diverse condizioni.

A seconda della complessità della logica dell’interfaccia utente dell’applicazione, potete scegliere l’approccio più adatto alle vostre esigenze.

Ricordate di mantenere il codice pulito, organizzato e leggibile e di testare sempre a fondo la logica di rendering condizionale per assicurarvi che funzioni come previsto in diversi scenari.

State cercando la soluzione di hosting ideale per le vostre applicazioni React? Provate gratuitamente l’Hosting di Applicazioni di Kinsta!