Обложка канала

Заметки про React

Короткие и полезные заметки про React

Заметки про React

5 лет назад
Открыть в
Ленивая инициализация useRef Владимир Клепов поделился техникой создания ленивой инициализации хука useRef. В отличие от useState, хук useRef не принимает функцию для инициализации значения. Ленивая инициализация может улучшить производительность компонента, т.к. позволяет вычислить значение рефа в момент его использования, а не при рендере компонента. Есть несколько подходов к реализации данной техники: - Установка значения рефа в useEffect. Минус в том, что значение рефа не будет доступно в первый рендер, в useLayoutEffect, а также в дочерних useEffect. - Кастомный хук с инициализацией на месте. Минус подхода в том, что функция инициализации выполняется даже если значение рефа было не нужно. Также инициализация блокирует первый рендер. const none = {}; function useLazyRef(init) { const ref = useRef(none); if (ref.current === none) { ref.current = init(); } return ref; } - Использовать useState. Хук можно использовать как реф если игнорировать функцию обновления. В этом случае, в хуке будет записана ссылка на один объект, и его изменение не будет вызывать ререндер. const ref = useState(() => ({ current: init() }))[0]; - Создать кастомный хук с полями аксессорами (accessor properties). Если у объекта задать геттер и сеттер на поле current и внутри использовать реф, то получится правильная ленивая инициализация рефа. Объект будет проинициализирован только при доступе к полю current. thoughtspile.github.io/2021/11…y-useref
Make useRef lazy — 4 ways

I love useRef, but it lacks the lazy initializer functionality found in other hooks (useState / useReducer / useMemo). useRef({ x: 0, y: 0 }) creates an object { x: 0, y: 0 } on ev

Vladimir Klepov as a Coder