@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 +54 -25
- 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
|
|
@@ -29,12 +27,12 @@
|
|
29
27
|
Пример использования `useRefMap` с `map` для создания ссылок на элементы и обработки события прокрутки:
|
30
28
|
|
31
29
|
```jsx
|
32
|
-
import
|
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
|
-
|
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
|
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
|
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
|
161
|
+
import useRefMap from '@qtpy/use-ref-map';
|
135
162
|
|
136
163
|
function Component() {
|
137
|
-
const { getRef,
|
164
|
+
const { getRef, allKeys } = useRefMap<HTMLElement>();
|
138
165
|
|
139
166
|
const logKeys = () => {
|
140
|
-
console.log('Текущие ключи:',
|
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<
|
189
|
+
getRef: (key: string) => RefObject<T>;
|
162
190
|
deleteRef: (key: string) => void;
|
163
|
-
|
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>`: Тип возвращаемого значения хука, который позволяет указать подмножество
|
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
|
-
- **Ограничение типизации**: `
|
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
|
};
|