useMemo нужен, чтобы вычислять и кэшировать дорогие значения, а не для побочных эффектов. Без возвращаемого значения useMemo возвращает undefined, что лишает хук смысла и обычно значит, что выбран не тот хук.
Нужно выполнять побочные эффекты при изменении зависимостей¶
Может возникнуть соблазн использовать useMemo для побочных эффектов:
1 2 3 4 5 6 7 8 9101112
// ❌ Wrong: Side effects in useMemofunctionComponent({user}){// No return value, just side effectuseMemo(()=>{analytics.track('UserViewed',{userId:user.id});},[user.id]);// Not assigned to a variableuseMemo(()=>{returnanalytics.track('UserViewed',{userId:user.id});},[user.id]);}
Если побочный эффект должен происходить в ответ на действие пользователя, лучше держать его рядом с событием:
123456789
// ✅ Good: Side effects in event handlersfunctionComponent({user}){consthandleClick=()=>{analytics.track('ButtonClicked',{userId:user.id});// Other click logic...};return<buttononClick={handleClick}>Clickme</button>;}
Если побочный эффект синхронизирует состояние React с каким-то внешним состоянием (или наоборот), используйте useEffect:
123456789
// ✅ Good: Synchronization in useEffectfunctionComponent({theme}){useEffect(()=>{localStorage.setItem('preferredTheme',theme);document.body.className=theme;},[theme]);return<div>Currenttheme:{theme}</div>;}