Я пытаюсь обернуть голову вокруг новых крючков API реагировать. В частности, я пытаюсь создать классический вариант использования, который когда-то был следующим:
componentDidUpdate(prevProps) {
if (prevProps.foo !== this.props.foo) {
// animate dom elements here...
this.animateSomething(this.ref, this.props.onAnimationComplete);
}
}
Теперь я попытался построить то же самое с компонентом функции и useEffect
, но не могу понять, как это сделать. Вот что я попробовал:
useEffect(() => {
animateSomething(ref, props.onAnimationComplete);
}, [props.foo]);
Таким образом, эффект вызывается только при изменении props.foo. И это работает - НО! Похоже, что это анти-шаблон, так как eslint-plugin-react-hooks
помечает это как ошибку. Все зависимости, которые используются внутри эффекта, должны быть объявлены в массиве зависимостей. Это значит, что мне нужно сделать следующее:
useEffect(() => {
animateSomething(ref, props.onAnimationComplete);
}, [props.foo, ref, props.onAnimationComplete]);
Это не приводит к ошибке линтинга, НО полностью исключает цель только , вызывающую эффект при изменении props.foo
. Я НЕ ХОЧУ, чтобы его вызывали, когда другой реквизит или реф поменяли.
Теперь я прочитал кое-что об использовании useCallback
, чтобы обернуть это. Я попробовал, но дальше не получилось.
Может кто-нибудь помочь?