useDeferredValue
useDeferredValue
useDeferredValue
es otro hook introducido en React que pertenece a las APIs de Concurrent Mode. Este hook es útil para diferir la actualización de un valor durante un período específico, lo que puede ser útil para optimizar el rendimiento en ciertos casos, como la gestión de entradas del usuario o la animación de elementos.
-
Importación: Primero, necesitas importar el hook desde React.
import React, { useState, useDeferredValue } from 'react' -
Sintaxis básica:
const deferredValue = useDeferredValue(value, { timeoutMs })value
: El valor que quieres diferir.timeoutMs
: Tiempo en milisegundos que determina cuánto tiempo se debe diferir la actualización del valor.
Ejemplo Básico
Vamos a crear un ejemplo simple donde un campo de entrada reacciona de manera diferida a la entrada del usuario.
import React, { useState, useDeferredValue } from 'react'
function DeferredInput() { const [inputValue, setInputValue] = useState('') const deferredValue = useDeferredValue(inputValue, { timeoutMs: 1000 })
const handleChange = (e) => { setInputValue(e.target.value) }
return ( <div> <input type="text" value={inputValue} onChange={handleChange} /> <p>Deferred Value: {deferredValue}</p> </div> )}
export default DeferredInput
Desglose del Ejemplo
-
Estado y Función de Cambio:
const [inputValue, setInputValue] = useState('')useState
se utiliza para manejar el estado del valor de entrada. -
Uso de
useDeferredValue
:const deferredValue = useDeferredValue(inputValue, { timeoutMs: 1000 })useDeferredValue
se llama coninputValue
como el valor que queremos diferir, ytimeoutMs
especifica que la actualización se debe diferir durante 1000 milisegundos (1 segundo). -
Manejo de Cambios en el Campo de Entrada:
const handleChange = (e) => {setInputValue(e.target.value)}handleChange
se llama cada vez que el usuario ingresa algo en el campo de entrada, actualizandoinputValue
. -
Renderizado del Valor Diferido:
<p>Deferred Value: {deferredValue}</p>Muestra el valor diferido en un párrafo después de que haya transcurrido el tiempo especificado (
timeoutMs
).
Uso Avanzado
useDeferredValue
es útil cuando se desea diferir la actualización de un valor para optimizar el rendimiento, especialmente en casos donde el valor cambia rápidamente y queremos evitar re-renderizados innecesarios.
Ejemplo con Anotaciones de Usuario
Supongamos que queremos optimizar la actualización de anotaciones que los usuarios realizan en una imagen.
import React, { useState, useDeferredValue } from 'react'
function UserAnnotations() { const [annotations, setAnnotations] = useState([]) const [currentAnnotation, setCurrentAnnotation] = useState('') const deferredAnnotations = useDeferredValue(annotations, { timeoutMs: 500 })
const addAnnotation = () => { setAnnotations((prevAnnotations) => [...prevAnnotations, currentAnnotation]) setCurrentAnnotation('') }
return ( <div> <input type="text" value={currentAnnotation} onChange={(e) => setCurrentAnnotation(e.target.value)} placeholder="Add annotation" /> <button onClick={addAnnotation}>Add</button> <p>Annotations: {deferredAnnotations.join(', ')}</p> </div> )}
export default UserAnnotations
Desglose del Ejemplo de Anotaciones
-
Estado y Funciones de Modificación:
const [annotations, setAnnotations] = useState([])const [currentAnnotation, setCurrentAnnotation] = useState('')useState
maneja el estado de las anotaciones y la anotación actual que el usuario está ingresando. -
Uso de
useDeferredValue
:const deferredAnnotations = useDeferredValue(annotations, { timeoutMs: 500 })useDeferredValue
se usa para diferir la actualización deannotations
durante 500 milisegundos (medio segundo). -
Función para Agregar Anotaciones:
const addAnnotation = () => {setAnnotations((prevAnnotations) => [...prevAnnotations, currentAnnotation])setCurrentAnnotation('')}addAnnotation
agrega la anotación actual a la lista de anotaciones y luego limpia el campo de entrada. -
Renderizado de las Anotaciones Diferidas:
<p>Annotations: {deferredAnnotations.join(', ')}</p>Muestra las anotaciones diferidas en un párrafo después de que haya transcurrido el tiempo especificado (
timeoutMs
).