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

Заметки про React

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

Заметки про React

4 года назад
Открыть в
Использование хука useSyncExternalStore В React 18 появился новый хук useSyncExternalStore, который используется для чтения и подписки на внешние источники данных и совместим с конкурентным рендерингом. В основном он используется в библиотеках управления состояния, например, Redux для реализации селекторов. Также хук useSyncExternalStore может использоваться и в коде приложения для предотвращения лишних ререндеров компонента. Для примера рассмотрим хук useLocation из библиотеки react-router. Он возвращает объект с несколькими атрибутами.
function CurrentHash() {
  const { hash } = useLocation();
  return <div>{hash}</div>;
}
Возможно для работы компонента не нужны все атрибуты, однако при изменении любого из них произойдет ререндер компонента, даже если он не используется. Это может негативно повлиять на производительность приложения, особенно если этот хук используется в главном компоненте приложения App.js. Для того чтобы избежать лишних ререндеров в данном примере, можно получать нужный атрибут через селектор, используя useSyncExternalStore. Хук принимает 3 аргумента: - subscribe: функция, которая вызывает колбек при изменении значений. - getSnapshot: функция, которая возвращает текущее значение стора. - getServerSnapshot: функция, которая возвращает значение стора во время серверного рендеринга. Чтобы реализовать через useSyncExternalStore селектор location, необходимо установить библиотеку history. Перенесем API history на аргументы useSyncExternalStore: - history.listen: подписки на изменения. - history: текущее значение. Таким образом, реализация кастомного хука будет довольна проста:
function useHistorySelector(selector) {
  return useSyncExternalStore(history.listen, () =>
    selector(history)
  );
}

function CurrentPathname() {
  const pathname = useHistorySelector(
    (history) => history.location.pathname
  );
  return <div>{pathname}</div>;
}

function CurrentHash() {
  const hash = useHistorySelector(
    (history) => history.location.hash
  );
  return <div>{hash}</div>;
}
Hooks API Reference – React

A JavaScript library for building user interfaces

reactjs.org