El renderizado condicional es una potente función de React que permite a los desarrolladores renderizar componentes basándose en determinadas condiciones.

Es un concepto fundamental que desempeña un papel crucial en la creación de aplicaciones web dinámicas e interactivas.

En esta completa guía, nos sumergiremos en el renderizado condicional en React, cubriendo técnicas básicas y avanzadas con ejemplos para su correcta comprensión.

Comprendiendo el Renderizado Condicional en React

La renderización condicional en React permite a los desarrolladores controlar dinámicamente qué contenido se muestra en la pantalla en función de valores específicos que pueden almacenarse en una variable, estado o props.

Esto puede ser extremadamente útil en situaciones en las que quieras mostrar u ocultar determinados elementos de la interfaz de usuario, cambiar el diseño de una página o mostrar contenido diferente en función de las interacciones del usuario.

El renderizado condicional es importante en las aplicaciones React porque te permite crear interfaces de usuario dinámicas e interactivas que pueden responder a datos cambiantes e interacciones del usuario en tiempo real.

Te ayudará a mejorar el rendimiento y la eficiencia de tus aplicaciones evitando la renderización innecesaria de componentes o elementos que no son necesarios.

Técnicas Básicas para el Renderizado Condicional

Existen varias técnicas básicas que puedes utilizar para el renderizado condicional en React. Exploremos cada una de ellas en detalle.

Uso de la sentencia if para el renderizado condicional

Una de las formas más sencillas de implementar la renderización condicional en React es utilizar la sentencia tradicional if.

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

La sentencia if de JavaScript puede utilizarse dentro del método render() de tu componente para renderizar condicionalmente el contenido en función de una determinada condición.

Por ejemplo, puedes utilizar la sentencia if para mostrar un spinner de carga mientras esperas a que se carguen los datos:

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;

En este ejemplo, MyComponent obtiene datos de una API utilizando el gancho useEffect. Mientras esperamos a que se carguen los datos, mostramos un componente Spinner utilizando la sentencia if.

Otro ejemplo puede ser mostrar una interfaz de usuario alternativa cuando se produce un error al mostrar tu 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;

En este código, tenemos un MyComponent que toma una proposición data. Si la proposición data es falsa, mostramos un mensaje de error utilizando la declaración if.

Por último, puedes mostrar contenido diferente para distintos roles de usuario con la sentencia 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;

En este código, tenemos un MyComponent que toma una propiedad user. Dependiendo de la propiedad user.role, mostramos un contenido diferente utilizando la sentencia if.

Uso del operador ternario para la visualización condicional

Otra forma concisa de implementar el renderizado condicional en React es utilizar el operador ternario (?) dentro de JSX.

El operador ternario te permite escribir una sentencia if-else compacta en línea especificando 3 operandos. El primer operando es la condición, mientras que los otros dos operandos son las expresiones. Si la condición es true, se ejecutará la primera expresión; en caso contrario, la segunda.

Por ejemplo, puedes representar distintos componentes en función de una prop:

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

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

export default ExampleComponent;

En este código, tenemos un ExampleComponent que toma una proposición llamada shouldRenderComponentA. Utilizamos el operador ternario para mostrar condicionalmente ComponentA o ComponentB en función del valor de la proposición.

También puedes mostrar un texto diferente en función de un estado:

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;

En este ejemplo, utilizamos el operador ternario para mostrar condicionalmente un texto diferente en función del valor del estado showMessage. Cuando se pulsa el botón, se cambia el valor de showMessage y el texto se muestra u oculta en consecuencia.

Por último, puedes mostrar un spinner de carga mientras se obtienen los datos:

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;

En este ejemplo, utilizamos el operador ternario para mostrar condicionalmente un spinner de carga mientras se obtienen datos de una API. Una vez que los datos están disponibles, mostramos la propiedad title utilizando el operador ternario.

Uso de los operadores lógicos AND y OR para la representación condicional

También puedes utilizar los operadores lógicos AND (&&) y OR (||) para implementar la renderización condicional en React.

El operador lógico AND te permite renderizar un componente sólo si una determinada condición es verdadera, mientras que el operador lógico OR te permite renderizar un componente si cualquiera de las condiciones es verdadera.

Estos operadores son útiles cuando tienes condiciones sencillas que determinan si un componente debe renderizarse o no. Por ejemplo, si quieres mostrar un botón sólo si un formulario es válido, puedes utilizar el operador lógico Y así:

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;

En este ejemplo, tenemos un FormComponent que tiene un formulario con dos campos de entrada para username y password. Estamos utilizando el gancho useState para gestionar los valores del formulario y la variable isFormValid para comprobar si ambos campos de entrada tienen valores. Utilizando el operador lógico AND (&&), mostramos el botón de envío sólo si isFormValid es verdadero. Esto garantiza que el botón sólo se active cuando el formulario sea válido.

Del mismo modo, puedes utilizar el operador OR para mostrar un mensaje de carga si los datos se siguen cargando o un mensaje de error si se produce un error:

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;

En este ejemplo, un DataComponent obtiene datos de una API utilizando fetch y los muestra en una lista. Estamos utilizando el gancho useState para gestionar los datos, el estado de carga y el mensaje de error. Utilizando el operador lógico OR (||), podemos mostrar un mensaje de carga o un mensaje de error si cualquiera de sus condiciones es verdadera. Esto garantiza que el usuario vea un mensaje que indica el estado actual del proceso de obtención de datos.

Utilizar los operadores lógicos AND y OR para la representación condicional en React es una forma concisa y legible de manejar condiciones sencillas. Sin embargo, es mejor utilizar otros enfoques como las sentencias switch para una lógica más compleja.

Técnicas Avanzadas Para el Renderizado Condicional

La renderización condicional en React puede ser más compleja dependiendo de los requisitos de tu aplicación. Aquí tienes algunas técnicas avanzadas que puedes utilizar para la renderización condicional en escenarios más complejos.

Uso de sentencias switch para el renderizado condicional

Aunque las sentencias if y los operadores ternarios son enfoques comunes para la renderización condicional, a veces una sentencia switch puede ser más apropiada, especialmente cuando se trata de múltiples condiciones.

Aquí tienes un ejemplo:

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;

En este código, se utiliza una sentencia switch para representar condicionalmente el contenido en función de la proposición userType. Este enfoque puede ser útil cuando se trabaja con múltiples condiciones y proporciona una forma más organizada y legible de manejar la lógica compleja.

Renderizado condicional con React Router

React Router es una biblioteca popular para gestionar el enrutamiento del lado del cliente en aplicaciones React. React Router te permite renderizar condicionalmente componentes basados en la ruta actual.

Aquí tienes un ejemplo de cómo implementar la renderización condicional 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;

En este código, utilizamos el estado isLoggedIn para mostrar condicionalmente el componente Dashboard si el usuario ha iniciado sesión, o el componente NotFound si el usuario no ha iniciado sesión. El componente Login establece el estado isLoggedIn en true una vez que el usuario ha iniciado sesión correctamente.

Ten en cuenta que estamos utilizando la prop del componente <Route> para pasar el componente Login y la función setIsLoggedIn. Esto nos permite pasar props al componente Login sin especificarlo en la prop path.

Resumen

La renderización condicional es una potente técnica de React que te permite actualizar dinámicamente la interfaz de usuario en función de distintas condiciones.

Dependiendo de la complejidad de la lógica de la interfaz de usuario de tu aplicación, puedes elegir el enfoque que mejor se adapte a tus necesidades.

Recuerda mantener tu código limpio, organizado y legible, y prueba siempre a fondo tu lógica de renderizado condicional para asegurarte de que funciona como se espera en diferentes escenarios.

¿Buscas la solución de alojamiento ideal para tus aplicaciones React? ¡Prueba gratis el alojamiento de aplicaciones de Kinsta!

Joel Olawanle Kinsta

Joel is a Frontend developer working at Kinsta as a Technical Editor. He is a passionate teacher with love for open source and has written over 200 technical articles majorly around JavaScript and it's frameworks.