Вы немного запутались с формулировкой. Это не тот эффект, который выполняется при размонтировании при передаче пустого массива, а функция очистки, которая является функцией, возвращаемой из useEffect, которое будет выполняться.
например, вы можете получить вышеуказанный эффект как
useEffect(() => {
API.getUser(userId);
return () => {
// cancel api here
}
}, [userId]);
Таким образом, в приведенном выше примере анонимная функция, возвращаемая useEffect, будет вызываться до того, как эффект будет запущен во второй раз (что происходит при изменении userId) или во время размонтирования