@qtpy/use-ref-map 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,26 +1,24 @@
1
- # Документация по хуку useRefMap
2
-
3
- `useRefMap` — это пользовательский React-хук для управления множеством ссылок (`RefObject`) с использованием ключей. Он позволяет динамически создавать, получать и удалять ссылки, а также предоставляет список всех ключей. Хук полезен для императивного управления компонентами или DOM-элементами, например, для вызова методов компонентов, фокусировки или обработки событий прокрутки.
4
-
5
1
  ## Содержание
6
2
  - [Возвращаемые значения](#возвращаемые-значения)
7
3
  - [Использование](#использование)
8
4
  - [Базовое использование](#базовое-использование)
9
5
  - [Императивное управление (вызов метода компонента)](#императивное-управление-вызов-метода-компонента)
10
6
  - [Удаление ссылки](#удаление-ссылки)
7
+ - [Очистка всех ссылок](#очистка-всех-ссылок)
11
8
  - [Получение всех ключей](#получение-всех-ключей)
12
9
  - [Типы](#типы)
13
10
  - [Примечания](#примечания)
14
11
 
15
12
  ## Возвращаемые значения
16
13
 
17
- Хук `useRefMap` возвращает объект со следующими методами:
14
+ Хук `useRefMap` возвращает объект со следующими методами и свойствами:
18
15
 
19
- | Метод | Тип | Описание |
16
+ | Метод/Свойство | Тип | Описание |
20
17
  |----------------|------------------------------------------|--------------------------------------------------------------------------|
21
- | `getRef` | `(key: string) => RefObject<Partial<T>>` | Возвращает ссылку (`RefObject`) для указанного ключа. Если ссылка не существует, создаётся новая с `current: null`. |
18
+ | `getRef` | `(key: string) => RefObject<T>` | Возвращает ссылку (`RefObject`) для указанного ключа. Если ссылка не существует, создаётся новая с `current: null`. |
22
19
  | `deleteRef` | `(key: string) => void` | Удаляет ссылку и соответствующий ключ из внутреннего хранилища. |
23
- | `getAllKeys` | `() => string[]` | Возвращает массив всех ключей, связанных с существующими ссылками. |
20
+ | `clearAllRefs` | `() => void` | Очищает все ссылки и ключи из внутреннего хранилища. |
21
+ | `allKeys` | `string[]` | Возвращает массив всех ключей, связанных с существующими ссылками. |
24
22
 
25
23
  ## Использование
26
24
 
@@ -30,11 +28,11 @@
30
28
 
31
29
  ```jsx
32
30
  import useRefMap from '@qtpy/use-ref-map';
33
- import useEvent from '@qtpy/use-event'; //хук для обработки событий
31
+ import useEvent from '@qtpy/use-event'; // хук для обработки событий
34
32
  import { useState } from 'react';
35
33
 
36
34
  function ProjectsPage() {
37
- const { getRef } = useRefMap<HTMLDivElement>();
35
+ const { getRef, allKeys } = useRefMap<HTMLDivElement>();
38
36
  const [activeIndex, setActiveIndex] = useState(0);
39
37
  const projects = ['Проект 1', 'Проект 2', 'Проект 3'];
40
38
 
@@ -66,13 +64,15 @@ function ProjectsPage() {
66
64
  ))}
67
65
  </div>
68
66
  <p>Активный проект: {projects[activeIndex]}</p>
67
+ <p>Ключи ссылок: {allKeys.join(', ')}</p>
69
68
  </div>
70
69
  );
71
70
  }
72
71
  ```
73
- Ссылка на hook [**useEvent**](https://www.npmjs.com/package/@qtpy/use-event)
74
72
 
75
- В этом примере хук `useRefMap` используется для создания ссылок на элементы `<div>` с помощью метода `map` и ключей вида `project_${index}`. При прокрутке страницы хук `useEvent` проверяет положение каждого элемента через `getBoundingClientRect` и обновляет `activeIndex`, если элемент выходит за верхнюю границу окна, подсвечивая активный проект.
73
+ Ссылка на хук [**useEvent**](https://www.npmjs.com/package/@qtpy/use-event)
74
+
75
+ В этом примере хук `useRefMap` используется для создания ссылок на элементы `<div>` с помощью метода `map` и ключей вида `project_${index}`. При прокрутке страницы хук `useEvent` проверяет положение каждого элемента через `getBoundingClientRect` и обновляет `activeIndex`, если элемент выходит за верхнюю границу окна, подсвечивая активный проект. Список ключей выводится через `allKeys`.
76
76
 
77
77
  ### Императивное управление (вызов метода компонента)
78
78
 
@@ -127,6 +127,32 @@ function Component() {
127
127
  }
128
128
  ```
129
129
 
130
+ ### Очистка всех ссылок
131
+
132
+ Пример использования метода `clearAllRefs` для удаления всех ссылок:
133
+
134
+ ```jsx
135
+ import useRefMap from '@qtpy/use-ref-map';
136
+
137
+ function Component() {
138
+ const { getRef, clearAllRefs, allKeys } = useRefMap<HTMLElement>();
139
+
140
+ const clearRefs = () => {
141
+ clearAllRefs();
142
+ console.log('Все ссылки очищены. Текущие ключи:', allKeys);
143
+ };
144
+
145
+ return (
146
+ <div>
147
+ <section ref={getRef('section1')}>Секция 1</section>
148
+ <section ref={getRef('section2')}>Секция 2</section>
149
+ <button onClick={clearRefs}>Очистить все ссылки</button>
150
+ <p>Ключи: {allKeys.join(', ')}</p>
151
+ </div>
152
+ );
153
+ }
154
+ ```
155
+
130
156
  ### Получение всех ключей
131
157
 
132
158
  Получение списка всех ключей для проверки существующих ссылок:
@@ -135,10 +161,10 @@ function Component() {
135
161
  import useRefMap from '@qtpy/use-ref-map';
136
162
 
137
163
  function Component() {
138
- const { getRef, getAllKeys } = useRefMap<HTMLElement>();
164
+ const { getRef, allKeys } = useRefMap<HTMLElement>();
139
165
 
140
166
  const logKeys = () => {
141
- console.log('Текущие ключи:', getAllKeys());
167
+ console.log('Текущие ключи:', allKeys);
142
168
  };
143
169
 
144
170
  return (
@@ -146,6 +172,7 @@ function Component() {
146
172
  <section ref={getRef('section1')}>Секция 1</section>
147
173
  <section ref={getRef('section2')}>Секция 2</section>
148
174
  <button onClick={logKeys}>Вывести ключи</button>
175
+ <p>Ключи: {allKeys.join(', ')}</p>
149
176
  </div>
150
177
  );
151
178
  }
@@ -159,23 +186,24 @@ function Component() {
159
186
  export type RefMap<T> = Record<string, RefObject<T>>;
160
187
 
161
188
  export type RefMapMethods<T> = {
162
- getRef: (key: string) => RefObject<Partial<T>>;
189
+ getRef: (key: string) => RefObject<T>;
163
190
  deleteRef: (key: string) => void;
164
- getAllKeys: () => string[];
191
+ clearAllRefs: () => void;
192
+ allKeys: string[];
165
193
  };
166
194
 
167
195
  export type UseRefMapReturn<T, E extends keyof RefMapMethods<T>> = Pick<RefMapMethods<T>, E>;
168
196
  ```
169
197
 
170
198
  - `RefMap<T>`: Объект, где ключи — это строки, а значения — `RefObject<T>`.
171
- - `RefMapMethods<T>`: Интерфейс, описывающий методы, возвращаемые хуком.
172
- - `UseRefMapReturn<T, E>`: Тип возвращаемого значения хука, который позволяет указать подмножество методов через `E`.
199
+ - `RefMapMethods<T>`: Интерфейс, описывающий методы и свойства, возвращаемые хуком.
200
+ - `UseRefMapReturn<T, E>`: Тип возвращаемого значения хука, который позволяет указать подмножество методов/свойств через `E`.
173
201
 
174
202
  ## Примечания
175
203
 
176
204
  - **Императивное управление**: Хук удобен для вызова методов компонентов (например, `setIsActive`) или DOM-операций, таких как `scrollIntoView`, `focus` или `getBoundingClientRect`, через свойство `current`.
177
205
  - **Инициализация ссылок**: Метод `getRef` создаёт новую ссылку с `current: null`, если ссылка для указанного ключа ещё не существует.
178
- - **Типизация**: Хук поддерживает обобщённый тип `T` для работы с любыми типами данных (например, пользовательскими интерфейсами компонентов или `HTMLElement`).
179
- - **Управление памятью**: Метод `deleteRef` предотвращает утечки памяти, удаляя ненужные ссылки.
180
- - **Сохранение состояния**: Хук использует `useRef` для хранения ссылок и ключей, что обеспечивает их неизменность между рендерами без лишних обновлений.
181
- - **Ограничение типизации**: `RefObject` возвращает `Partial<T>`, чтобы учесть случаи, когда `current` может быть `null`.
206
+ - **Типизация**: Хук поддерживает обобщённый тип `T` для работы с любыми типами данных (например, пользовательскими интерфейсами компонентов или `HTMLElement`). В отличие от предыдущей версии, `getRef` возвращает `RefObject<T>` вместо `RefObject<Partial<T>>`, предполагая, что `current` может быть `null`, но типизация остаётся строгой.
207
+ - **Управление памятью**: Метод `deleteRef` удаляет отдельные ссылки, а `clearAllRefs` очищает все ссылки, предотвращая утечки памяти. Хук автоматически очищает все ссылки при размонтировании компонента через `useEffect`.
208
+ - **Сохранение состояния**: Хук использует `useRef` для хранения ссылок и ключей, а `useMemo` для кэширования массива ключей, обновляемого через внутренний счётчик версии (`version`).
209
+ - **Ограничение типизации**: Свойство `allKeys` возвращает `string[]` напрямую, а не функцию, что упрощает доступ к ключам, но требует использования `useMemo` для оптимизации рендеринга.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";const n=require("react");function u(){const r=n.useRef({}),t=n.useRef(new Set);return{getRef:e=>(r.current[e]||(r.current[e]={current:null},t.current.add(e)),r.current[e]),deleteRef:e=>{r.current[e]&&(delete r.current[e],t.current.delete(e))},getAllKeys:()=>Array.from(t.current)}}module.exports=u;
1
+ "use strict";const t=require("react");function l(){const r=t.useRef({}),n=t.useRef(new Set),[u,f]=t.useState(0),o=e=>(r.current[e]||(r.current[e]={current:null},n.current.add(e)),r.current[e]),c=e=>{r.current[e]&&(delete r.current[e],n.current.delete(e))},s=()=>{Object.keys(r.current).forEach(c),f(e=>e+1)};return t.useEffect(()=>()=>s(),[]),{getRef:o,deleteRef:c,clearAllRefs:s,allKeys:t.useMemo(()=>Array.from(n.current),[u])}}module.exports=l;
package/dist/index.d.ts CHANGED
@@ -1,13 +1,10 @@
1
- import { RefObject } from "react";
1
+ import { RefObject } from 'react';
2
2
  export type RefMap<T> = Record<string, RefObject<T>>;
3
- export default function useRefMap<T>(): {
3
+ export type RefMapMethods<T> = {
4
4
  getRef: (key: string) => RefObject<T>;
5
5
  deleteRef: (key: string) => void;
6
- getAllKeys: () => string[];
7
- };
8
- export type RefMapMethods<T> = {
9
- getRef: (key: string) => RefObject<Partial<T>>;
10
- deleteRef: (key: string) => RefObject<Partial<T>>;
11
- getAllKeys: () => string[];
6
+ clearAllRefs: () => void;
7
+ allKeys: string[];
12
8
  };
9
+ export default function useRefMap<T>(): RefMapMethods<T>;
13
10
  export type UseRefMapReturn<T, E extends keyof RefMapMethods<T>> = Pick<RefMapMethods<T>, E>;
package/dist/index.mjs CHANGED
@@ -1,14 +1,17 @@
1
- import { useRef as n } from "react";
2
- function s() {
3
- const r = n({}), t = n(/* @__PURE__ */ new Set());
4
- return {
5
- getRef: (e) => (r.current[e] || (r.current[e] = { current: null }, t.current.add(e)), r.current[e]),
6
- deleteRef: (e) => {
7
- r.current[e] && (delete r.current[e], t.current.delete(e));
8
- },
9
- getAllKeys: () => Array.from(t.current)
1
+ import { useRef as s, useState as l, useEffect as a, useMemo as d } from "react";
2
+ function R() {
3
+ const r = s({}), t = s(/* @__PURE__ */ new Set()), [u, f] = l(0), o = (e) => (r.current[e] || (r.current[e] = { current: null }, t.current.add(e)), r.current[e]), n = (e) => {
4
+ r.current[e] && (delete r.current[e], t.current.delete(e));
5
+ }, c = () => {
6
+ Object.keys(r.current).forEach(n), f((e) => e + 1);
7
+ };
8
+ return a(() => () => c(), []), {
9
+ getRef: o,
10
+ deleteRef: n,
11
+ clearAllRefs: c,
12
+ allKeys: d(() => Array.from(t.current), [u])
10
13
  };
11
14
  }
12
15
  export {
13
- s as default
16
+ R as default
14
17
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qtpy/use-ref-map",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "author": "QtPy",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/TheOnlyFastCoder2/QtPy-library/tree/main/useRefMap",