useEffect
можно использовать для запуска кода один раз, но это происходит при монтировании компонента, поэтому это аналог componentDidMount
, а не конструктор:
let components = useRef();
useEffect(() => {
components.current = props.components.map(createComponentFactory(props.context))
}, []);
// components.current === null
// on first render
useMemo
можно использовать длявыполнить код один раз при первом рендеринге:
const components = useMemo(
() => props.components.map(createComponentFactory(props.context)),
[]
);
Не гарантированно запускать код один раз в будущих версиях React:
Вы можете положиться на использованиеMemo в качестве оптимизации производительностине как семантическая гарантия.В будущем React может решить «забыть» некоторые ранее запомненные значения и пересчитать их при следующем рендеринге, например, чтобы освободить память для компонентов вне экрана.Напишите свой код, чтобы он по-прежнему работал без useMemo, а затем добавьте его для оптимизации производительности.
useState
можно использовать для однократного запуска кода при первом рендеринге:
const [components] = useState(
() => props.components.map(createComponentFactory(props.context))
);
Из-за ограничений других опций последний вариант можно считать предпочтительным способом сделать это.