Skip to content

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.

  1. Importación: Primero, necesitas importar el hook desde React.

    import React, { useState, useDeferredValue } from 'react'
  2. 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 con inputValue como el valor que queremos diferir, y timeoutMs 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, actualizando inputValue.

  • 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 de annotations 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).