npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@qtpy/use-ref-map

v0.0.4

Published

- [Возвращаемые значения](#возвращаемые-значения) - [Использование](#использование) - [Базовое использование](#базовое-использование) - [Императивное управление (вызов метода компонента)](#императивное-управление-вызов-метода-компонента) - [Удаление

Readme

Содержание

Возвращаемые значения

Хук useRefMap возвращает объект со следующими методами и свойствами:

| Метод/Свойство | Тип | Описание | |----------------|------------------------------------------|--------------------------------------------------------------------------| | getRef | (key: string) => RefObject<T> | Возвращает ссылку (RefObject) для указанного ключа. Если ссылка не существует, создаётся новая с current: null. | | deleteRef | (key: string) => void | Удаляет ссылку и соответствующий ключ из внутреннего хранилища. | | clearAllRefs | () => void | Очищает все ссылки и ключи из внутреннего хранилища. | | getAllKeys | () => string[] | Возвращает массив всех ключей, связанных с существующими ссылками. |

Использование

Базовое использование

Пример использования useRefMap с map для создания ссылок на элементы и обработки события прокрутки:

import useRefMap from '@qtpy/use-ref-map';
import useEvent from '@qtpy/use-event'; // хук для обработки событий
import { useState } from 'react';

function ProjectsPage() {
  const { getRef, getAllKeys } = useRefMap<HTMLDivElement>();
  const [activeIndex, setActiveIndex] = useState(0);
  const projects = ['Проект 1', 'Проект 2', 'Проект 3'];

  useEvent('scroll', () => {
    for (let i = 0; i < projects.length; i++) {
      const key = `project_${i}`;
      const el = getRef(key).current;
      if (el) {
        const { top, height } = el.getBoundingClientRect();
        if (top + height < window.scrollY) {
          setActiveIndex(i); // Обновляем активный индекс при прокрутке
        }
      }
    }
  }, {});

  return (
    <div className="ProjectsPage">
      <h1>Проекты</h1>
      <div className="ProjectsPage_container">
        {projects.map((title, index) => (
          <div
            key={index}
            ref={getRef(`project_${index}`)}
            style={{ background: index === activeIndex ? '#e0e0e0' : 'white' }}
          >
            <h2>{title}</h2>
          </div>
        ))}
      </div>
      <p>Активный проект: {projects[activeIndex]}</p>
      <p>Ключи ссылок: {getAllKeys.join(', ')}</p>
    </div>
  );
}

Ссылка на хук useEvent

В этом примере хук useRefMap используется для создания ссылок на элементы <div> с помощью метода map и ключей вида project_${index}. При прокрутке страницы хук useEvent проверяет положение каждого элемента через getBoundingClientRect и обновляет activeIndex, если элемент выходит за верхнюю границу окна, подсвечивая активный проект. Список ключей выводится через getAllKeys.

Императивное управление (вызов метода компонента)

Пример императивного вызова метода компонента через useRefMap:

import useRefMap from '@qtpy/use-ref-map';

interface AnimatedLabelComponent {
  setIsActive: (value: boolean) => void;
}

function AccordionCard({ keyName, title }: { keyName: string; title: string }) {
  const { getRef } = useRefMap<AnimatedLabelComponent>();

  return (
    <Accordion onClick={(value) => getRef(keyName).current?.setIsActive?.(value)}>
      <Accordion.Header>
        <AnimatedLabel ref={getRef(keyName)} title={title} />
      </Accordion.Header>
      <Accordion.Content>
        <div>Контент аккордеона</div>
      </Accordion.Content>
    </Accordion>
  );
}

В этом примере хук useRefMap используется для хранения ссылки на компонент AnimatedLabel по ключу keyName. При клике на аккордеон вызывается метод setIsActive компонента AnimatedLabel для управления его состоянием.

Удаление ссылки

Удаление ненужной ссылки из хранилища:

import useRefMap from '@qtpy/use-ref-map';

function Component() {
  const { getRef, deleteRef } = useRefMap<HTMLElement>();

  const removeRef = () => {
    deleteRef('section1');
    console.log('Ссылка на section1 удалена');
  };

  return (
    <div>
      <section ref={getRef('section1')}>Секция 1</section>
      <button onClick={removeRef}>Удалить ссылку</button>
    </div>
  );
}

Очистка всех ссылок

Пример использования метода clearAllRefs для удаления всех ссылок:

import useRefMap from '@qtpy/use-ref-map';

function Component() {
  const { getRef, clearAllRefs, getAllKeys } = useRefMap<HTMLElement>();

  const clearRefs = () => {
    clearAllRefs();
    console.log('Все ссылки очищены. Текущие ключи:', getAllKeys());
  };

  return (
    <div>
      <section ref={getRef('section1')}>Секция 1</section>
      <section ref={getRef('section2')}>Секция 2</section>
      <button onClick={clearRefs}>Очистить все ссылки</button>
      <p>Ключи: {getAllKeys().join(', ')}</p>
    </div>
  );
}

Получение всех ключей

Получение списка всех ключей для проверки существующих ссылок:

import useRefMap from '@qtpy/use-ref-map';

function Component() {
  const { getRef, getAllKeys } = useRefMap<HTMLElement>();

  const logKeys = () => {
    console.log('Текущие ключи:', getAllKeys());
  };

  return (
    <div>
      <section ref={getRef('section1')}>Секция 1</section>
      <section ref={getRef('section2')}>Секция 2</section>
      <button onClick={logKeys}>Вывести ключи</button>
      <p>Ключи: {getAllKeys().join(', ')}</p>
    </div>
  );
}

Типы

Хук useRefMap использует следующие TypeScript-типы:

export type RefMap<T> = Record<string, RefObject<T>>;

export type RefMapMethods<T> = {
  getRef: (key: string) => RefObject<T>;
  deleteRef: (key: string) => void;
  clearAllRefs: () => void;
  getAllKeys: () => string[];
};

export type UseRefMapReturn<T, E extends keyof RefMapMethods<T>> = Pick<RefMapMethods<T>, E>;
  • RefMap<T>: Объект, где ключи — это строки, а значения — RefObject<T>.
  • RefMapMethods<T>: Интерфейс, описывающий методы и свойства, возвращаемые хуком.
  • UseRefMapReturn<T, E>: Тип возвращаемого значения хука, который позволяет указать подмножество методов/свойств через E.

Примечания

  • Императивное управление: Хук удобен для вызова методов компонентов (например, setIsActive) или DOM-операций, таких как scrollIntoView, focus или getBoundingClientRect, через свойство current.
  • Инициализация ссылок: Метод getRef создаёт новую ссылку с current: null, если ссылка для указанного ключа ещё не существует.
  • Типизация: Хук поддерживает обобщённый тип T для работы с любыми типами данных (например, пользовательскими интерфейсами компонентов или HTMLElement). В отличие от предыдущей версии, getRef возвращает RefObject<T> вместо RefObject<Partial<T>>, предполагая, что current может быть null, но типизация остаётся строгой.
  • Управление памятью: Метод deleteRef удаляет отдельные ссылки, а clearAllRefs очищает все ссылки, предотвращая утечки памяти. Хук автоматически очищает все ссылки при размонтировании компонента через useEffect.
  • Сохранение состояния: Хук использует useRef для хранения ссылок и ключей.
  • Ограничение типизации: Свойство getAllKeys возвращает string[].