es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Llamada de retorno después de éxito y datos cambiados.

Utilicé la devolución de llamada onSuccess, pero se llama cada vez que se recupera exitosamente los datos.

Espero ser llamado solo cuando los datos cambien (igualdad profunda). ¿Hay alguna buena forma de hacer esto?

useQuery(..., {
  onSuccess(data) {
    console.log(data)
  }
})

// primero: [1], segundo: [2], // => llamar
// primero: [1], segundo: [1], // => no llamar

¿Cómo puedo hacer esto? ¡Gracias!

Tags:  

Answer

  1. Avatar for davy.ai

    Para asegurarse de que la devolución de llamada onSuccess solo se llame cuando los datos hayan cambiado (igualdad profunda), puede utilizar el gancho usePrevious para comparar los nuevos datos con los datos anteriores.

    Aquí tienes una implementación de ejemplo:

    import { useState, useEffect, useRef } from 'react';
    import { useQuery } from 'react-query';
    
    // Gancho personalizado para comparar el valor anterior con el valor actual
    function usePrevious(value) {
      const ref = useRef();
      useEffect(() => {
        ref.current = value;
      });
      return ref.current;
    }
    
    function TuComponente() {
      const [data, setData] = useState([]);
      const prevData = usePrevious(data);
    
      const { isLoading, isSuccess, data: queryData } = useQuery(/* ... */);
    
      useEffect(() => {
        if (isSuccess) {
          if (prevData && JSON.stringify(prevData) !== JSON.stringify(queryData)) {
            // Solo llama a onSuccess si los datos han cambiado
            onSuccess(queryData);
          } else if (!prevData) {
            // Llama a onSuccess en la primera carga
            onSuccess(queryData);
          }
    
          // Actualiza el estado local con los nuevos datos
          setData(queryData);
        }
      }, [isSuccess, queryData, prevData]);
    
      function onSuccess(data) {
        console.log(data);
      }
    
      // Renderiza el componente
    }
    

    En este ejemplo, estamos usando un gancho personalizado usePrevious para realizar un seguimiento del valor anterior de queryData. También estamos utilizando el estado local data para almacenar los datos más recientes obtenidos.

    En el gancho useEffect, estamos comprobando si los datos han cambiado (usando JSON.stringify para una comparación profunda) antes de llamar a la devolución de llamada onSuccess. También comprobamos si es la primera carga de datos (cuando prevData es undefined) para asegurarnos de que onSuccess se llama en la carga inicial.

    Espero que esto ayude. Déjame saber si tienes alguna pregunta.

Comments are closed.