@qtpy/use-ref-map 0.0.0 → 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
 
@@ -29,12 +27,12 @@
29
27
  Пример использования `useRefMap` с `map` для создания ссылок на элементы и обработки события прокрутки:
30
28
 
31
29
  ```jsx
32
- import { useRefMap } from './useRefMap';
30
+ import useRefMap from '@qtpy/use-ref-map';
31
+ import useEvent from '@qtpy/use-event'; // хук для обработки событий
33
32
  import { useState } from 'react';
34
- import { useEvent } from './useEvent'; // Предполагаемый хук для обработки событий
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,19 +64,22 @@ 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
72
 
74
- В этом примере хук `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`.
75
76
 
76
77
  ### Императивное управление (вызов метода компонента)
77
78
 
78
79
  Пример императивного вызова метода компонента через `useRefMap`:
79
80
 
80
81
  ```jsx
81
- import { useRefMap } from './useRefMap';
82
+ import useRefMap from '@qtpy/use-ref-map';
82
83
 
83
84
  interface AnimatedLabelComponent {
84
85
  setIsActive: (value: boolean) => void;
@@ -107,7 +108,7 @@ function AccordionCard({ keyName, title }: { keyName: string; title: string }) {
107
108
  Удаление ненужной ссылки из хранилища:
108
109
 
109
110
  ```jsx
110
- import { useRefMap } from './useRefMap';
111
+ import useRefMap from '@qtpy/use-ref-map';
111
112
 
112
113
  function Component() {
113
114
  const { getRef, deleteRef } = useRefMap<HTMLElement>();
@@ -126,18 +127,44 @@ function Component() {
126
127
  }
127
128
  ```
128
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
+
129
156
  ### Получение всех ключей
130
157
 
131
158
  Получение списка всех ключей для проверки существующих ссылок:
132
159
 
133
160
  ```jsx
134
- import { useRefMap } from './useRefMap';
161
+ import useRefMap from '@qtpy/use-ref-map';
135
162
 
136
163
  function Component() {
137
- const { getRef, getAllKeys } = useRefMap<HTMLElement>();
164
+ const { getRef, allKeys } = useRefMap<HTMLElement>();
138
165
 
139
166
  const logKeys = () => {
140
- console.log('Текущие ключи:', getAllKeys());
167
+ console.log('Текущие ключи:', allKeys);
141
168
  };
142
169
 
143
170
  return (
@@ -145,6 +172,7 @@ function Component() {
145
172
  <section ref={getRef('section1')}>Секция 1</section>
146
173
  <section ref={getRef('section2')}>Секция 2</section>
147
174
  <button onClick={logKeys}>Вывести ключи</button>
175
+ <p>Ключи: {allKeys.join(', ')}</p>
148
176
  </div>
149
177
  );
150
178
  }
@@ -158,23 +186,24 @@ function Component() {
158
186
  export type RefMap<T> = Record<string, RefObject<T>>;
159
187
 
160
188
  export type RefMapMethods<T> = {
161
- getRef: (key: string) => RefObject<Partial<T>>;
189
+ getRef: (key: string) => RefObject<T>;
162
190
  deleteRef: (key: string) => void;
163
- getAllKeys: () => string[];
191
+ clearAllRefs: () => void;
192
+ allKeys: string[];
164
193
  };
165
194
 
166
195
  export type UseRefMapReturn<T, E extends keyof RefMapMethods<T>> = Pick<RefMapMethods<T>, E>;
167
196
  ```
168
197
 
169
198
  - `RefMap<T>`: Объект, где ключи — это строки, а значения — `RefObject<T>`.
170
- - `RefMapMethods<T>`: Интерфейс, описывающий методы, возвращаемые хуком.
171
- - `UseRefMapReturn<T, E>`: Тип возвращаемого значения хука, который позволяет указать подмножество методов через `E`.
199
+ - `RefMapMethods<T>`: Интерфейс, описывающий методы и свойства, возвращаемые хуком.
200
+ - `UseRefMapReturn<T, E>`: Тип возвращаемого значения хука, который позволяет указать подмножество методов/свойств через `E`.
172
201
 
173
202
  ## Примечания
174
203
 
175
204
  - **Императивное управление**: Хук удобен для вызова методов компонентов (например, `setIsActive`) или DOM-операций, таких как `scrollIntoView`, `focus` или `getBoundingClientRect`, через свойство `current`.
176
205
  - **Инициализация ссылок**: Метод `getRef` создаёт новую ссылку с `current: null`, если ссылка для указанного ключа ещё не существует.
177
- - **Типизация**: Хук поддерживает обобщённый тип `T` для работы с любыми типами данных (например, пользовательскими интерфейсами компонентов или `HTMLElement`).
178
- - **Управление памятью**: Метод `deleteRef` предотвращает утечки памяти, удаляя ненужные ссылки.
179
- - **Сохранение состояния**: Хук использует `useRef` для хранения ссылок и ключей, что обеспечивает их неизменность между рендерами без лишних обновлений.
180
- - **Ограничение типизации**: `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.0",
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",