@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 +50 -22
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +5 -8
- package/dist/index.mjs +13 -10
- package/package.json +1 -1
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<
|
18
|
+
| `getRef` | `(key: string) => RefObject<T>` | Возвращает ссылку (`RefObject`) для указанного ключа. Если ссылка не существует, создаётся новая с `current: null`. |
|
22
19
|
| `deleteRef` | `(key: string) => void` | Удаляет ссылку и соответствующий ключ из внутреннего хранилища. |
|
23
|
-
| `
|
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
|
-
|
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,
|
164
|
+
const { getRef, allKeys } = useRefMap<HTMLElement>();
|
139
165
|
|
140
166
|
const logKeys = () => {
|
141
|
-
console.log('Текущие ключи:',
|
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<
|
189
|
+
getRef: (key: string) => RefObject<T>;
|
163
190
|
deleteRef: (key: string) => void;
|
164
|
-
|
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>`: Тип возвращаемого значения хука, который позволяет указать подмножество
|
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
|
-
- **Ограничение типизации**: `
|
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
|
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
|
1
|
+
import { RefObject } from 'react';
|
2
2
|
export type RefMap<T> = Record<string, RefObject<T>>;
|
3
|
-
export
|
3
|
+
export type RefMapMethods<T> = {
|
4
4
|
getRef: (key: string) => RefObject<T>;
|
5
5
|
deleteRef: (key: string) => void;
|
6
|
-
|
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
|
2
|
-
function
|
3
|
-
const r =
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
-
|
16
|
+
R as default
|
14
17
|
};
|