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 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
- ## Examples
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
+ ```
@@ -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 : [] : Object.values(listenersMap).flat();
147
- for (let listener of listeners) {
148
- listener();
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
- listenersMap[code] = [...(_a = listenersMap[code]) != null ? _a : [], listener];
201
+ (_a = listenersMap[code]) != null ? _a : listenersMap[code] = /* @__PURE__ */ new Set();
202
+ listenersMap[code].add(listener);
201
203
  return () => {
202
- listenersMap[code] = listenersMap[code].filter((l) => l !== listener);
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 map = react.useSyncExternalStore(subscribeMap, getMapSnapshot);
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(!clone ? map : clonedMap),
246
- [clone, map, clonedMap]
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(map);
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) {
@@ -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 : [] : Object.values(listenersMap).flat();
18
- for (let listener of listeners) {
19
- listener();
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
- listenersMap[code] = [...(_a = listenersMap[code]) != null ? _a : [], listener];
72
+ (_a = listenersMap[code]) != null ? _a : listenersMap[code] = /* @__PURE__ */ new Set();
73
+ listenersMap[code].add(listener);
72
74
  return () => {
73
- listenersMap[code] = listenersMap[code].filter((l) => l !== listener);
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 map = useSyncExternalStore(subscribeMap, getMapSnapshot);
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(!clone ? map : clonedMap),
117
- [clone, map, clonedMap]
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(map);
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.2",
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/xuuui/v-dict"
8
+ "url": "https://github.com/rrryyi/v-dict"
9
9
  },
10
- "main": "dist/index.js",
11
- "module": "dist/index.mjs",
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
  }