const ref = useRef<HTMLDivElement>(null);
const prevRef = useRef<HTMLDivElement>(null);
useEffect(() => {
if (ref.current === prevRef.current) { return; }
prevRef.current = ref.current;
// реф поменялся, что-то делаем
});
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
// реф поменялся, что-то делаем
}, [ref.current]);
const useNNN = (ref) => {
useEffect(() => {
// реф поменялся, что-то делаем
}, [ref.current]);
}
const MyComp = (props) => {
const ref = useRef(null);
useNNN(ref);
return (
...
{props.someCondition && <div ref={ref} />}
...
);
};
и вот повесив зависимость от стейта и использовав реф напрямую ненадо будет иметь ещё один реф для проверки изменения нашего рефа и эффект будет тригериться только тогда, когда надо.
реф будет присвоен после выполнения тела компонента, но перед эффектом.
его проставляют на фазе эффектов хуков useLayoutEffect/useImperativeHandle. Собственно, что-то вроде последнего и выполняется внутри < div > (любого встроенного компонента). На момент срабатывания useLayoutEffect значения в рефе может и не быть: пример с чилдом