Вот как вы можете сделать то, что у вас было раньше, используя хуки в функциональном компоненте.
Я бы определил пользовательский хук для имитации componentDidUpdate()
, основываясь на ответе на Make ReactХук useEffect не запускается при начальном рендеринге :
function useUpdate (effect, deps) {
const firstUpdate = useRef(true);
const update = useCallback(() => {
if (firstUpdate.current) {
firstUpdate.current = false;
} else {
return effect();
}
}, [firstUpdate, effect]);
useLayoutEffect(update, deps);
}
...
useUpdate(handleFoo, [fooKey]);
useUpdate(handleMoreFoo, [moreFooKey]);
useLayoutEffect()
гарантирует, что обратные вызовы handleX()
вызываются на той же фазе каждого рендера, что и аналогичный жизненный цикл componentDidMount()
и componentDidUpdate()
методы. Если вас не волнует точная фаза их вызова, вы можете заменить useLayoutEffect()
на useEffect()
.
. Остальная часть пользовательского хука гарантирует, что он пропускает вызовы handleX()
callbacks. после первоначального рендера. Если ваши handleX()
обратные вызовы могут быть вызваны после первоначального рендеринга, то вы можете просто вызвать useEffect()
непосредственно в вашем функциональном компоненте вместо этого useUpdate()
пользовательского перехвата.