В чём отличие хука useMemo от useCallback в React?
Отличий два
1) useCallback(func, deps) - ни что иное как useMemo(() => func, deps)
То есть useCallback возвращает функцию, а useMemo выполняет функцию и возвращает результат (в обоих случаях - при условии что депсы поменялись).
2) про useMemo в документации есть предостережение, что Реакт не гарантирует сохранность результата и может вычислить ещё раз, даже при неизменных депсах. Про useCallback такого не сказано.
Оба хука нужны для того, чтобы при передаче возвращаемых ими данных в качестве пропсов в компонент-потомок, этот компонент-потомок не совершал лишние перерендеры.
То есть хук useCallback при одинаковых зависимостях создаст ссылку на функцию один раз. При передаче в компонент-потомок, этот компонент-потомок проверит что ссылка не поменялась и не будет делать лишний ререндер.
Хук useMemo нужен для того же, но если useCallback возвращает функцию, то useMemo возвращает какие-то данные. И как писали ранее, useMemo не гарантирует, что ссылка на данные не изменится даже при одинаковых зависимостях.