Вот пользовательский хук, который просто предоставляет логический флаг, чтобы указать, является ли текущий рендеринг первым рендером (когда компонент был смонтирован). Он примерно такой же, как и некоторые другие ответы, но вы можете использовать флаг в useEffect
или в функции рендеринга или в любом другом месте компонента, который вы хотите. Может быть, кто-то может предложить лучшее имя.
import { useRef, useEffect } from 'react';
export const useIsMount = () => {
const isMountRef = useRef(true);
useEffect(() => {
isMountRef.current = false;
}, []);
return isMountRef.current;
};
Вы можете использовать его как:
import React, { useEffect } from 'react';
import { useIsMount } from './useIsMount';
const MyComponent = () => {
const isMount = useIsMount();
useEffect(() => {
if (isMount) {
console.log('First Render');
} else {
console.log('Subsequent Render');
}
});
return isMount ? <p>First Render</p> : <p>Subsequent Render</p>;
};
А вот тест, если вам интересно:
import { renderHook } from 'react-hooks-testing-library';
import { useIsMount } from '../useIsMount';
describe('useIsMount', () => {
it('should be true on first render and false after', () => {
const { result, rerender } = renderHook(() => useIsMount());
expect(result.current).toEqual(true);
rerender();
expect(result.current).toEqual(false);
rerender();
expect(result.current).toEqual(false);
});
});
Наш вариант использования заключался в том, чтобы скрыть анимированные элементы, если начальный реквизит указывает, что они должны быть скрыты. На более поздних рендерах, если реквизиты изменились, мы хотели, чтобы элементы оживили.