useTransition
useTransition
El hook useTransition
en React es parte de las nuevas API de React Concurrent Mode, diseñado para manejar las animaciones y transiciones de manera fluida y optimizada, especialmente cuando se realizan cambios en el estado que podrían causar re-renderizados visibles en la interfaz de usuario.
Introducción a useTransition
-
Importación: Primero, necesitas importar el hook desde React.
import React, { useState, useTransition } from 'react' -
Sintaxis básica:
const [startTransition, isPending] = useTransition({ timeoutMs })startTransition
: Función para iniciar una transición de manera concurrente.isPending
: Booleano que indica si la transición está pendiente.timeoutMs
(opcional): Tiempo máximo en milisegundos que React esperará antes de renderear la interfaz de usuario nuevamente.
Ejemplo Básico
Vamos a crear un componente simple que muestra cómo usar useTransition
para animar cambios de estado.
import React, { useState, useTransition } from 'react'
function TransitionComponent() { const [isVisible, setIsVisible] = useState(false) const [startTransition, isPending] = useTransition({ timeoutMs: 200 })
const toggleVisibility = () => { startTransition(() => { setIsVisible((prev) => !prev) }) }
return ( <div> <button onClick={toggleVisibility}>Toggle Visibility</button> {isPending ? <p>Loading...</p> : null} {isVisible ? <div style={{ width: '100px', height: '100px', background: 'red' }} /> : null} </div> )}
export default TransitionComponent
Desglose del Ejemplo
-
Estado y Función de Toggle:
const [isVisible, setIsVisible] = useState(false)useState
se utiliza para manejar el estado de visibilidad del componente. -
Inicio de la Transición:
const [startTransition, isPending] = useTransition({ timeoutMs: 200 })useTransition
se llama para obtenerstartTransition
, una función que inicia la transición de manera concurrente, yisPending
, un booleano que indica si la transición está en curso. -
Función para Alternar la Visibilidad:
const toggleVisibility = () => {startTransition(() => {setIsVisible((prev) => !prev)})}Cuando se hace clic en el botón,
toggleVisibility
se llama y usastartTransition
para cambiar el estado deisVisible
de manera que inicie una transición concurrente. -
Renderizado Condicional y Feedback Visual:
{isPending ? <p>Loading...</p> : null}{isVisible ? <div style={{ width: '100px', height: '100px', background: 'red' }} /> : null}Se muestra un mensaje de carga (
Loading...
) mientras la transición está en curso (isPending
es verdadero). CuandoisVisible
es verdadero, se muestra un div rojo, que representa el componente visible.
Uso Avanzado
useTransition
es particularmente útil cuando se trata de manejar animaciones o transiciones complejas, especialmente en interfaces de usuario dinámicas o aplicaciones con muchos cambios de estado.
Ejemplo con Lista de Elementos
Vamos a crear un ejemplo donde una lista de elementos se anima al agregar o eliminar elementos.
import React, { useState, useTransition } from 'react'
function ListComponent() { const [items, setItems] = useState([]) const [startTransition, isPending] = useTransition({ timeoutMs: 300 })
const addItem = () => { startTransition(() => { setItems((prevItems) => [...prevItems, items.length]) }) }
const removeItem = () => { startTransition(() => { setItems((prevItems) => prevItems.slice(0, -1)) }) }
return ( <div> <button onClick={addItem}>Add Item</button> <button onClick={removeItem} disabled={items.length === 0}> Remove Item </button> {isPending ? <p>Loading...</p> : null} <ul> {items.map((item) => ( <li key={item}>Item {item}</li> ))} </ul> </div> )}
export default ListComponent
Desglose del Ejemplo de Lista
-
Estado y Funciones de Modificación:
const [items, setItems] = useState([])useState
maneja el estado de la lista de elementos. -
Inicio de la Transición:
const [startTransition, isPending] = useTransition({ timeoutMs: 300 })useTransition
se utiliza para obtenerstartTransition
, una función para iniciar transiciones concurrentes, yisPending
, un booleano que indica si hay una transición pendiente. -
Funciones para Agregar y Quitar Elementos:
const addItem = () => {startTransition(() => {setItems((prevItems) => [...prevItems, items.length])})}const removeItem = () => {startTransition(() => {setItems((prevItems) => prevItems.slice(0, -1))})}addItem
yremoveItem
utilizanstartTransition
para agregar y quitar elementos de la lista respectivamente, iniciando transiciones concurrentes. -
Renderizado Condicional y Feedback Visual:
{isPending ? <p>Loading...</p> : null};<ul>{items.map((item) => (<li key={item}>Item {item}</li>))}</ul>Se muestra un mensaje de carga (
Loading...
) mientras la transición está en curso (isPending
es verdadero). La lista de elementos se renderiza usandoitems.map
con elementos<li>
.