Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

179
Vistas
¿Cómo comparar oldValues y newValues en React Hooks useEffect?

Digamos que tengo 3 entradas: tasa, cantidad de envío y cantidad de recepción. Puse esas 3 entradas en los parámetros de diferenciación de useEffect. Las reglas son:

  • Si sendAmount cambió, calculo receiveAmount = sendAmount * rate
  • Si el monto de recepción cambió, calculo sendAmount = receiveAmount / rate
  • Si la tasa cambió, calculo receiveAmount = sendAmount * rate cuando sendAmount > 0 o calculo sendAmount = receiveAmount / rate cuando receiveAmount > 0

Aquí está el codesandbox https://codesandbox.io/s/pkl6vn7x6j para demostrar el problema.

¿Hay alguna manera de comparar los oldValues y los valores newValues como en componentDidUpdate en lugar de crear 3 controladores para este caso?

Gracias


Aquí está mi solución final con usePrevious https://codesandbox.io/s/30n01w2r06

En este caso, no puedo usar varios useEffect porque cada cambio conduce a la misma llamada de red. Es por eso que también uso changeCount para rastrear el cambio. Este changeCount también es útil para realizar un seguimiento de los cambios solo desde el lugar local, por lo que puedo evitar llamadas de red innecesarias debido a los cambios del servidor.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Puede escribir un enlace personalizado para proporcionarle accesorios anteriores usando useRef

 function usePrevious(value) { const ref = useRef(); useEffect(() => { ref.current = value; }); return ref.current; }

y luego usarlo en useEffect

 const Component = (props) => { const {receiveAmount, sendAmount } = props const prevAmount = usePrevious({receiveAmount, sendAmount}); useEffect(() => { if(prevAmount.receiveAmount !== receiveAmount) { // process here } if(prevAmount.sendAmount !== sendAmount) { // process here } }, [receiveAmount, sendAmount]) }

Sin embargo, es más claro y probablemente mejor y más claro de leer y comprender si usa dos useEffect por separado para cada identificación de cambio que desea procesar por separado

over 4 years ago · Santiago Trujillo Denunciar

0

En caso de que alguien esté buscando una versión de TypeScript de uso anterior:

En un módulo .tsx :

 import { useEffect, useRef } from "react"; const usePrevious = <T extends unknown>(value: T): T | undefined => { const ref = useRef<T>(); useEffect(() => { ref.current = value; }); return ref.current; };

O en un módulo .ts :

 import { useEffect, useRef } from "react"; const usePrevious = <T>(value: T): T | undefined => { const ref = useRef<T>(); useEffect(() => { ref.current = value; }); return ref.current; };
over 4 years ago · Santiago Trujillo Denunciar

0

Opción 1: ejecutar useEffect cuando cambie el valor

 const Component = (props) => { useEffect(() => { console.log("val1 has changed"); }, [val1]); return <div>...</div>; };

Manifestación

Opción 2: gancho useHasChanged

Comparar un valor actual con un valor anterior es un patrón común y justifica un enlace personalizado propio que oculta los detalles de implementación.

 const Component = (props) => { const hasVal1Changed = useHasChanged(val1) useEffect(() => { if (hasVal1Changed ) { console.log("val1 has changed"); } }); return <div>...</div>; }; const useHasChanged= (val: any) => { const prevVal = usePrevious(val) return prevVal !== val } const usePrevious = (value) => { const ref = useRef(); useEffect(() => { ref.current = value; }); return ref.current; }

Manifestación

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda