Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

282
Views
¿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 answers
Answer question

0

Puede escribir un gancho 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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!