v-dict 2.0.2 → 2.0.4
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 +89 -2
- package/dist/react/index.cjs +14 -11
- package/dist/react/index.js +14 -11
- package/package.json +7 -10
package/README.md
CHANGED
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
* @Description:
|
|
6
6
|
-->
|
|
7
7
|
|
|
8
|
-
# Vue3 Dict Manager
|
|
8
|
+
# Vue3 & React Dict Manager
|
|
9
|
+
|
|
10
|
+
## 目录
|
|
11
|
+
|
|
12
|
+
- [Vue](#vue)
|
|
13
|
+
- [React](#react)
|
|
9
14
|
|
|
10
15
|
## Installation
|
|
11
16
|
|
|
@@ -13,7 +18,7 @@
|
|
|
13
18
|
npm i v-dict
|
|
14
19
|
```
|
|
15
20
|
|
|
16
|
-
##
|
|
21
|
+
## Vue
|
|
17
22
|
|
|
18
23
|
### dict.ts
|
|
19
24
|
|
|
@@ -147,3 +152,85 @@ onMounted(async () => {
|
|
|
147
152
|
})
|
|
148
153
|
</script>
|
|
149
154
|
```
|
|
155
|
+
|
|
156
|
+
## React
|
|
157
|
+
|
|
158
|
+
### dict.ts
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
import { createDictManager, defineDictData } from 'v-dict/react'
|
|
162
|
+
|
|
163
|
+
export const dm = createDictManager({
|
|
164
|
+
fetch: (code) =>
|
|
165
|
+
Promise.resolve([
|
|
166
|
+
{ label: 'xx', value: 'xx' },
|
|
167
|
+
{ label: 'xx', value: 'xx' }
|
|
168
|
+
]),
|
|
169
|
+
extra: ({ map }) => {
|
|
170
|
+
return {
|
|
171
|
+
getLabel: (value: string) => map[value]?.label
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
export const useStatusDict = dm.defineDict('STATUS', {
|
|
177
|
+
data: defineDictData({
|
|
178
|
+
ENABLED: {
|
|
179
|
+
label: 'Enabled',
|
|
180
|
+
color: 'green'
|
|
181
|
+
},
|
|
182
|
+
DISABLED: {
|
|
183
|
+
label: 'Disabled',
|
|
184
|
+
color: 'red'
|
|
185
|
+
}
|
|
186
|
+
})
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
export const useRemoteStatusDict = dm.defineDict('REMOTE_STATUS', {
|
|
190
|
+
remote: true,
|
|
191
|
+
fetch: (code) =>
|
|
192
|
+
Promise.resolve([
|
|
193
|
+
{ label: 'Enabled', value: 'ENABLED', color: 'green' },
|
|
194
|
+
{ label: 'Disabled', value: 'DISABLED', color: 'red' }
|
|
195
|
+
]),
|
|
196
|
+
extra: ({ map }) => {
|
|
197
|
+
return {
|
|
198
|
+
getItemDetail: (value: string) => map[value]
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
// clear one dict
|
|
204
|
+
// dm.clear('REMOTE_STATUS')
|
|
205
|
+
|
|
206
|
+
// clear all dicts
|
|
207
|
+
// dm.clear()
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### xx.tsx
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
import { useEffect } from 'react'
|
|
214
|
+
import { useRemoteStatusDict } from './dict'
|
|
215
|
+
|
|
216
|
+
export default function Demo() {
|
|
217
|
+
const statusDict = useRemoteStatusDict({
|
|
218
|
+
// same as above
|
|
219
|
+
clone: false,
|
|
220
|
+
// same as above
|
|
221
|
+
immediate: true,
|
|
222
|
+
// same as above
|
|
223
|
+
refresh: false
|
|
224
|
+
})
|
|
225
|
+
|
|
226
|
+
return (
|
|
227
|
+
<div>
|
|
228
|
+
<div>{E.ENABLED}</div>
|
|
229
|
+
<div>{map[E.ENABLED]?.label}</div>
|
|
230
|
+
<div>{statusDict.getLabel(E.ENABLED)}</div>
|
|
231
|
+
<div>{statusDict.getItem(E.DISABLED)?.color}</div>
|
|
232
|
+
<div>{list.length}</div>
|
|
233
|
+
</div>
|
|
234
|
+
)
|
|
235
|
+
}
|
|
236
|
+
```
|
package/dist/react/index.cjs
CHANGED
|
@@ -143,10 +143,11 @@ function createDictManager(createDictManagerOptions = {}) {
|
|
|
143
143
|
const listenersMap = /* @__PURE__ */ Object.create(null);
|
|
144
144
|
function emitChange(code) {
|
|
145
145
|
var _a;
|
|
146
|
-
const listeners = code ? (_a = listenersMap[code]) != null ? _a :
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
146
|
+
const listeners = code ? (_a = listenersMap[code]) != null ? _a : /* @__PURE__ */ new Set() : Object.values(listenersMap).reduce((acc, set) => {
|
|
147
|
+
set.forEach((listener) => acc.add(listener));
|
|
148
|
+
return acc;
|
|
149
|
+
}, /* @__PURE__ */ new Set());
|
|
150
|
+
listeners.forEach((listener) => listener());
|
|
150
151
|
}
|
|
151
152
|
function clear(code) {
|
|
152
153
|
var _a;
|
|
@@ -197,9 +198,10 @@ function createDictManager(createDictManagerOptions = {}) {
|
|
|
197
198
|
}
|
|
198
199
|
function subscribeMap(listener) {
|
|
199
200
|
var _a;
|
|
200
|
-
|
|
201
|
+
(_a = listenersMap[code]) != null ? _a : listenersMap[code] = /* @__PURE__ */ new Set();
|
|
202
|
+
listenersMap[code].add(listener);
|
|
201
203
|
return () => {
|
|
202
|
-
listenersMap[code]
|
|
204
|
+
listenersMap[code].delete(listener);
|
|
203
205
|
};
|
|
204
206
|
}
|
|
205
207
|
function getMapSnapshot() {
|
|
@@ -239,11 +241,12 @@ function createDictManager(createDictManagerOptions = {}) {
|
|
|
239
241
|
const loadPromiseRef = react.useRef(
|
|
240
242
|
!clone ? globalLoadPromise : createPromise()
|
|
241
243
|
);
|
|
242
|
-
const
|
|
244
|
+
const globalMap = react.useSyncExternalStore(subscribeMap, getMapSnapshot);
|
|
243
245
|
const [clonedMap, setClonedMap] = react.useState(/* @__PURE__ */ new Map());
|
|
246
|
+
const map = !clone ? globalMap : clonedMap;
|
|
244
247
|
const state = react.useMemo(
|
|
245
|
-
() => createStateFromMap(
|
|
246
|
-
[
|
|
248
|
+
() => createStateFromMap(map),
|
|
249
|
+
[map]
|
|
247
250
|
);
|
|
248
251
|
const load = react.useCallback((options) => {
|
|
249
252
|
const oldLoadPromise = loadPromiseRef.current;
|
|
@@ -266,11 +269,11 @@ function createDictManager(createDictManagerOptions = {}) {
|
|
|
266
269
|
emitChange(code);
|
|
267
270
|
return;
|
|
268
271
|
}
|
|
269
|
-
setClonedMap(
|
|
272
|
+
setClonedMap(/* @__PURE__ */ new Map());
|
|
270
273
|
}, []);
|
|
271
274
|
const getItem = react.useCallback((value) => {
|
|
272
275
|
return value !== null && value !== void 0 ? state.map[value] : null;
|
|
273
|
-
}, []);
|
|
276
|
+
}, [state]);
|
|
274
277
|
react.useEffect(() => {
|
|
275
278
|
if (!remote || immediate) {
|
|
276
279
|
if (clone) {
|
package/dist/react/index.js
CHANGED
|
@@ -14,10 +14,11 @@ function createDictManager(createDictManagerOptions = {}) {
|
|
|
14
14
|
const listenersMap = /* @__PURE__ */ Object.create(null);
|
|
15
15
|
function emitChange(code) {
|
|
16
16
|
var _a;
|
|
17
|
-
const listeners = code ? (_a = listenersMap[code]) != null ? _a :
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}
|
|
17
|
+
const listeners = code ? (_a = listenersMap[code]) != null ? _a : /* @__PURE__ */ new Set() : Object.values(listenersMap).reduce((acc, set) => {
|
|
18
|
+
set.forEach((listener) => acc.add(listener));
|
|
19
|
+
return acc;
|
|
20
|
+
}, /* @__PURE__ */ new Set());
|
|
21
|
+
listeners.forEach((listener) => listener());
|
|
21
22
|
}
|
|
22
23
|
function clear(code) {
|
|
23
24
|
var _a;
|
|
@@ -68,9 +69,10 @@ function createDictManager(createDictManagerOptions = {}) {
|
|
|
68
69
|
}
|
|
69
70
|
function subscribeMap(listener) {
|
|
70
71
|
var _a;
|
|
71
|
-
|
|
72
|
+
(_a = listenersMap[code]) != null ? _a : listenersMap[code] = /* @__PURE__ */ new Set();
|
|
73
|
+
listenersMap[code].add(listener);
|
|
72
74
|
return () => {
|
|
73
|
-
listenersMap[code]
|
|
75
|
+
listenersMap[code].delete(listener);
|
|
74
76
|
};
|
|
75
77
|
}
|
|
76
78
|
function getMapSnapshot() {
|
|
@@ -110,11 +112,12 @@ function createDictManager(createDictManagerOptions = {}) {
|
|
|
110
112
|
const loadPromiseRef = useRef(
|
|
111
113
|
!clone ? globalLoadPromise : createPromise()
|
|
112
114
|
);
|
|
113
|
-
const
|
|
115
|
+
const globalMap = useSyncExternalStore(subscribeMap, getMapSnapshot);
|
|
114
116
|
const [clonedMap, setClonedMap] = useState(/* @__PURE__ */ new Map());
|
|
117
|
+
const map = !clone ? globalMap : clonedMap;
|
|
115
118
|
const state = useMemo(
|
|
116
|
-
() => createStateFromMap(
|
|
117
|
-
[
|
|
119
|
+
() => createStateFromMap(map),
|
|
120
|
+
[map]
|
|
118
121
|
);
|
|
119
122
|
const load = useCallback((options) => {
|
|
120
123
|
const oldLoadPromise = loadPromiseRef.current;
|
|
@@ -137,11 +140,11 @@ function createDictManager(createDictManagerOptions = {}) {
|
|
|
137
140
|
emitChange(code);
|
|
138
141
|
return;
|
|
139
142
|
}
|
|
140
|
-
setClonedMap(
|
|
143
|
+
setClonedMap(/* @__PURE__ */ new Map());
|
|
141
144
|
}, []);
|
|
142
145
|
const getItem = useCallback((value) => {
|
|
143
146
|
return value !== null && value !== void 0 ? state.map[value] : null;
|
|
144
|
-
}, []);
|
|
147
|
+
}, [state]);
|
|
145
148
|
useEffect(() => {
|
|
146
149
|
if (!remote || immediate) {
|
|
147
150
|
if (clone) {
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "v-dict",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Vue3 & React Dict Manager",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "https://github.com/
|
|
8
|
+
"url": "https://github.com/rrryyi/v-dict"
|
|
9
9
|
},
|
|
10
|
-
"main": "dist/index.
|
|
11
|
-
"module": "dist/index.
|
|
10
|
+
"main": "dist/index.cjs",
|
|
11
|
+
"module": "dist/index.js",
|
|
12
12
|
"typings": "dist/index.d.ts",
|
|
13
13
|
"exports": {
|
|
14
14
|
".": {
|
|
@@ -39,11 +39,9 @@
|
|
|
39
39
|
"vue",
|
|
40
40
|
"react",
|
|
41
41
|
"dict",
|
|
42
|
-
"dictionary"
|
|
43
|
-
"vue3",
|
|
44
|
-
"react-dict"
|
|
42
|
+
"dictionary"
|
|
45
43
|
],
|
|
46
|
-
"author": "",
|
|
44
|
+
"author": "rrryyi",
|
|
47
45
|
"license": "MIT",
|
|
48
46
|
"dependencies": {},
|
|
49
47
|
"peerDependencies": {
|
|
@@ -57,7 +55,6 @@
|
|
|
57
55
|
"@types/react": "^18.3.12",
|
|
58
56
|
"@types/react-dom": "^18.3.1",
|
|
59
57
|
"tsup": "^8.0.1",
|
|
60
|
-
"typescript": "^5.7.3"
|
|
61
|
-
"vue": "^3.4.10"
|
|
58
|
+
"typescript": "^5.7.3"
|
|
62
59
|
}
|
|
63
60
|
}
|