Búsqueda de sitios web

reactjs - ¿Por qué useEffect advierte sobre los campos que no necesito poner en el arreglo de dependencias?


He revisado la documentación de useEffect y no entiendo por qué recibo una advertencia por cada variable y función que uso dentro de useEffect, aunque no dependa de ellas.

Considera mi useEffect aquí

const [updatedComm, setUpdatedComm] = useState<ICommunication>(props.comm)
const [isEditOn, setIsEditOn] = useState<boolean | false>(false)
const getPublishedComm = () => { /* function implementation */ }
const dispatch = useDispatch();

useEffect(() => {
        if (!isEditOn && updatedComm !== props.comm) {
            const publishedComm = getPublishedComm()
            dispatch(editCommunication(publishedComm))
            setCurrentComm(publishedComm)
        }
    }, [isEditOn])

Mi única necesidad de ejecutar este efecto es cuando isEditOn cambia. Sin embargo, este código registra advertencias

  Line 66:8:  React Hook useEffect has missing dependencies: 'dispatch', 'getPublishedComm', 'props.comm', and 'updatedComm'. Either include them or remove the dependency array  react-hooks/exhaustive-deps

¿Qué puedo hacer para eliminar estas advertencias, o realmente me está faltando algo fundamental?

Por favor, ayúdame a entender.

Gracias

Respuesta #1

Haz esto para "silenciar" esa advertencia,
especialmente si estás seguro de que la re-renderización debería/shall/está basada en dependencias específicas

useEffect(() => {
   if (!isEditOn && updatedComm !== props.comm) {
      const publishedComm = getPublishedComm();
      dispatch(editCommunication(publishedComm));
      setCurrentComm(publishedComm);
   }
   // eslint-disable-next-line
}, [isEditOn])

Pero por lo que veo, incluso updatedComm debería ser parte de ese array de dependencias.
Vale la pena entender la esencia del array de dependencias en cuanto a la optimización del rendimiento al omitir efectos.

Respuesta #2

Debido a que useEffect ve tu uso de estados y de setters de estado, le preocupa que tengas muchas cosas que cambian dentro del callback, pero estés usando pocas dependencias.

Porque en el componente funcional, la función del manejador también cambia en el nuevo renderizado

Lo que podrías hacer es - extraer el cuerpo del efecto para evitar la advertencia

Pero está fuertemente desaconsejado: si sientes que estás haciendo algo mal, probablemente sea cierto, vuelve a leer la documentación

function editChanged (isEditOn) { // only isEditOn guaranteed to be fresh
   if (!isEditOn && updatedComm !== props.comm) {
      const publishedComm = getPublishedComm();
      dispatch(editCommunication(publishedComm));
      setCurrentComm(publishedComm);
   }
}

useEffect(() => {
   editChanged(isEditOn)
}, [isEditOn])