У useExecutableEffect логика идентичная useEffect за исключением того, что не происходит вызова callback'а если один параметров в массиве зависимостей имеет falsy значение.
import { useEffect, useState } from 'react'
function Component(props) {
const {
sourceOneData: { valueOne } // Данные приходят из первого сервиса (GA)
sourceTwoData: { valueTwo } // Данные приходят из второго сервиса (dadata)
} = props;
useExecutableEffect(() => {
/* it could be setState or dataLayer.push() or something useful */
doSomethingUseful({ valueOne, valueTwo });
}, [valueOne, valueTwo]);
return <>Some JSX</>
}
Часто при монтировании компонента, мы не получаем все нужные данные для правильного вызова useEffect. Из за этого приходится городить страшные if'ы c кучей проверок. Например получение userId у google analytics.
tweet про useEffect от Абрамова, обратить внимание на комментарии. На спринах много страшных if'ов внутри useEffect
import { useEffect, useState } from 'react'
/* Максимально грязная реализация */
function useExecutableEffect(fn, deps) {
if (deps.map((item) => Boolean(item).includes(false))) {
return;
} else {
fn()
}
}
Продумать нейминг. Продумать cleanup поведение