Esta pregunta está más relacionada con la comprensión del funcionamiento interno de useEffect. He leído algunos de los artículos, pero no pude encontrar la respuesta a la pregunta.
https://www.bussieck.com/useeffect-under-the-hood/
Mi pregunta específicamente es: "¿Cómo reaccionar sabe que tiene que ejecutar la función de limpieza?" Cuando veo useEffect, toma una función de devolución de llamada y devuelve una función que es opcional y que no se invoca instantáneamente. Entonces, ¿cómo se da cuenta reaccionar para llamarlo en la actualización de desmontaje/dependencia?
Así que ya has leído que ordenar realmente importa y React almacena "datos internos" por posición del gancho. De manera similar, useState almacena el "valor actual", useEffect también puede guardar algunos datos internos: los últimos valores para la lista de dependencias (inicialmente es [] ) y el valor devuelto la última vez que se ejecutó este useEffect específico (inicialmente undefined ).
Luego, una vez que la comparación interna de las dependencias dice "bien, las dependencias son diferentes, es necesario ejecutar este useEffect nuevamente", React toma el resultado de la última llamada y si es una función, la ejecuta sin ningún argumento (limpieza).
El efecto del siguiente paso en sí mismo se ejecuta, y lo que sea que devuelva, se almacena nuevamente en la ranura para el gancho actual, para verificarlo/ejecutarlo la próxima vez.
Claro, también se ejecutará la limpieza al desmontar. Si es una función.