Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

260
Visualizações
Pasar la matriz a la lista de dependencias useEffect

Hay algunos datos provenientes de un sondeo largo cada 5 segundos y me gustaría que mi componente envíe una acción cada vez que cambia un elemento de una matriz (o la longitud de la matriz). ¿Cómo evito que useEffect entre en un bucle infinito cuando paso una matriz como dependencia a useEffect pero aún logro enviar alguna acción si cambia algún valor?

 useEffect(() => { console.log(outcomes) }, [outcomes])

donde outcomes son una matriz de ID, como [123, 234, 3212] . Los elementos en la matriz pueden reemplazarse o eliminarse, por lo que la longitud total de la matriz podría permanecer igual, pero no tiene por qué hacerlo, por lo que pasar outcomes.length como dependencia no es el caso.

los outcomes provienen del selector personalizado de reseleccionar:

 const getOutcomes = createSelector( someData, data => data.map(({ outcomeId }) => outcomeId) )
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Puede pasar JSON.stringify(outcomes) como la lista de dependencias:

Leer más aquí

 useEffect(() => { console.log(outcomes) }, [JSON.stringify(outcomes)])
over 4 years ago · Santiago Trujillo Relatório

0

Otra opción de ES6 sería usar literales de plantilla para convertirlo en una cadena. Similar a JSON.stringify() , excepto que el resultado no estará envuelto en []

 useEffect(() => { console.log(outcomes) }, [`${outcomes}`])

Otra opción, si el tamaño de la matriz no cambia , sería distribuirlo en:

 useEffect(() => { console.log(outcomes) }, [ ...outcomes ])
over 4 years ago · Santiago Trujillo Relatório

0

El uso JSON.stringify() o cualquier método de comparación profundo puede ser ineficiente, si conoce de antemano la forma del objeto, puede escribir su propio gancho de efecto que activa la devolución de llamada en función del resultado de su función de igualdad personalizada.

useEffect funciona al verificar si cada valor en la matriz de dependencias es la misma instancia que la del renderizado anterior y ejecuta la devolución de llamada si uno de ellos no lo es. Por lo tanto, solo debemos mantener la instancia de los datos que nos interesa usar useRef y solo asignar uno nuevo si la verificación de igualdad personalizada devuelve false para activar el efecto.

 function arrayEqual(a1: any[], a2: any[]) { if (a1.length !== a2.length) return false; for (let i = 0; i < a1.length; i++) { if (a1[i] !== a2[i]) { return false; } } return true; } type MaybeCleanUpFn = void | (() => void); function useNumberArrayEffect(cb: () => MaybeCleanUpFn, deps: number[]) { const ref = useRef<number[]>(deps); if (!arrayEqual(deps, ref.current)) { ref.current = deps; } useEffect(cb, [ref.current]); }

Uso

 function Child({ arr }: { arr: number[] }) { useNumberArrayEffect(() => { console.log("run effect", JSON.stringify(arr)); }, arr); return <pre>{JSON.stringify(arr)}</pre>; }

Yendo un paso más allá, también podemos reutilizar el gancho creando un gancho de efecto que acepte una función de igualdad personalizada.

 type MaybeCleanUpFn = void | (() => void); type EqualityFn = (a: DependencyList, b: DependencyList) => boolean; function useCustomEffect( cb: () => MaybeCleanUpFn, deps: DependencyList, equal?: EqualityFn ) { const ref = useRef<DependencyList>(deps); if (!equal || !equal(deps, ref.current)) { ref.current = deps; } useEffect(cb, [ref.current]); }

Uso

 useCustomEffect( () => { console.log("run custom effect", JSON.stringify(arr)); }, [arr], (a, b) => arrayEqual(a[0], b[0]) );

Demo en vivo

Edite 59467758/passing-array-to-useeffect-dependency-list

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda