@zcrkey/js-utils 0.0.4 → 0.0.5

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.
@@ -0,0 +1,185 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
3
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
4
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
5
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
7
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
8
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
12
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
13
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
14
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
15
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
16
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
18
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
19
+ import { cloneDeep as _cloneDeep, find as _find, get as _get, keyBy as _keyBy } from 'lodash';
20
+ var CrTreeUtil = /*#__PURE__*/function () {
21
+ function CrTreeUtil() {
22
+ _classCallCheck(this, CrTreeUtil);
23
+ }
24
+ _createClass(CrTreeUtil, null, [{
25
+ key: "listToTree",
26
+ value:
27
+ /**
28
+ * 列表数据转树形数据
29
+ * @param list
30
+ * @param options
31
+ * @param options.idField 默认值 id
32
+ * @param options.parentIdField 默认值 parentId
33
+ * @param options.childrenField 默认值 children
34
+ * @param options.isCloneDeep 是否需要深拷贝, 默认值为 true
35
+ * @param options.getData 处理数据
36
+ * @returns
37
+ */
38
+ function listToTree(list, options) {
39
+ var _ref = options || {},
40
+ _ref$idField = _ref.idField,
41
+ idField = _ref$idField === void 0 ? 'id' : _ref$idField,
42
+ _ref$parentIdField = _ref.parentIdField,
43
+ parentIdField = _ref$parentIdField === void 0 ? 'parentId' : _ref$parentIdField,
44
+ _ref$childrenField = _ref.childrenField,
45
+ childrenField = _ref$childrenField === void 0 ? 'children' : _ref$childrenField,
46
+ _ref$isCloneDeep = _ref.isCloneDeep,
47
+ isCloneDeep = _ref$isCloneDeep === void 0 ? true : _ref$isCloneDeep,
48
+ _ref$getData = _ref.getData,
49
+ getData = _ref$getData === void 0 ? function (item) {
50
+ return item;
51
+ } : _ref$getData;
52
+ var listData = isCloneDeep ? _cloneDeep(list) : list;
53
+ var treeData = [];
54
+ var nodeMap = new Map();
55
+ var _iterator = _createForOfIteratorHelper(listData),
56
+ _step;
57
+ try {
58
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
59
+ var _item = _step.value;
60
+ var id = _item[idField];
61
+ var node = _objectSpread(_objectSpread({}, getData(_item)), {}, {
62
+ __origin_id: id,
63
+ __origin_pid: _item[parentIdField]
64
+ });
65
+ nodeMap.set(id, node);
66
+ }
67
+ } catch (err) {
68
+ _iterator.e(err);
69
+ } finally {
70
+ _iterator.f();
71
+ }
72
+ var _iterator2 = _createForOfIteratorHelper(nodeMap.values()),
73
+ _step2;
74
+ try {
75
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
76
+ var _node = _step2.value;
77
+ var parentId = _node.__origin_pid;
78
+ if (parentId === undefined || parentId === null || parentId === 0 || !nodeMap.has(parentId)) {
79
+ treeData.push(_node);
80
+ } else {
81
+ var parentNode = nodeMap.get(parentId);
82
+ if (!parentNode[childrenField]) {
83
+ parentNode[childrenField] = [];
84
+ }
85
+ parentNode[childrenField].push(_node);
86
+ }
87
+ }
88
+ } catch (err) {
89
+ _iterator2.e(err);
90
+ } finally {
91
+ _iterator2.f();
92
+ }
93
+ var clean = function clean(nodes) {
94
+ var _iterator3 = _createForOfIteratorHelper(nodes),
95
+ _step3;
96
+ try {
97
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
98
+ var node = _step3.value;
99
+ delete node.__origin_id;
100
+ delete node.__origin_pid;
101
+ if (node[childrenField]) {
102
+ clean(node[childrenField]);
103
+ }
104
+ }
105
+ } catch (err) {
106
+ _iterator3.e(err);
107
+ } finally {
108
+ _iterator3.f();
109
+ }
110
+ };
111
+ clean(treeData);
112
+ return treeData;
113
+ }
114
+
115
+ /**
116
+ * 树形数据转列表数据
117
+ * @param tree
118
+ * @param options
119
+ * @param options.childrenField 默认值 children
120
+ * @param options.isCloneDeep 是否需要深拷贝, 默认值为 true
121
+ * @returns
122
+ */
123
+ }, {
124
+ key: "treeToList",
125
+ value: function treeToList(tree, options) {
126
+ var _ref2 = options || {},
127
+ _ref2$childrenField = _ref2.childrenField,
128
+ childrenField = _ref2$childrenField === void 0 ? 'children' : _ref2$childrenField,
129
+ _ref2$isCloneDeep = _ref2.isCloneDeep,
130
+ isCloneDeep = _ref2$isCloneDeep === void 0 ? true : _ref2$isCloneDeep;
131
+ var result = [];
132
+ var queue = _toConsumableArray(tree);
133
+ while (queue.length) {
134
+ var node = queue.shift();
135
+ var children = node[childrenField];
136
+ var _ = node[childrenField],
137
+ rest = _objectWithoutProperties(node, [childrenField].map(_toPropertyKey));
138
+ result.push(rest);
139
+ if (children && children.length) {
140
+ queue.push.apply(queue, _toConsumableArray(children));
141
+ }
142
+ }
143
+ return isCloneDeep ? _cloneDeep(result) : result;
144
+ }
145
+
146
+ /**
147
+ * 获取扁平化父数据(包含自身)
148
+ * @param listData
149
+ * @param value
150
+ * @param settings
151
+ * @param settings.valueField 默认值 value
152
+ * @param settings.idField 默认值 id
153
+ * @param settings.parentIdField 默认值 parentId
154
+ * @param settings.getData 过滤数据
155
+ */
156
+ }, {
157
+ key: "getFlatParentDatas",
158
+ value: function getFlatParentDatas(listData, value, settings) {
159
+ if (!Array.isArray(listData) || listData.length === 0 || value == null) {
160
+ return [];
161
+ }
162
+ var options = Object.assign({
163
+ valueField: 'value',
164
+ idField: 'id',
165
+ parentIdField: 'parentId',
166
+ getData: function getData(item) {
167
+ return item;
168
+ }
169
+ }, settings);
170
+ var nodeMap = _keyBy(listData, options.valueField);
171
+ var result = [];
172
+ var visited = new Set();
173
+ var current = nodeMap[value];
174
+ while (current && !visited.has(_get(current, options.idField))) {
175
+ visited.add(_get(current, options.idField));
176
+ result.unshift(options.getData(current));
177
+ var parentId = _get(current, options.parentIdField);
178
+ current = _find(listData, [options.valueField, parentId]);
179
+ }
180
+ return result;
181
+ }
182
+ }]);
183
+ return CrTreeUtil;
184
+ }();
185
+ export { CrTreeUtil as default };
package/dist/util.d.ts CHANGED
@@ -10,7 +10,7 @@ export default class CrUtil {
10
10
  * @param value
11
11
  * @returns boolean
12
12
  */
13
- static isObject<T = any>(value: T): value is T extends Array<any> ? never : T;
13
+ static isObject<T = any>(value: T): value is T extends object ? (T extends any[] ? never : T) : never;
14
14
  /**
15
15
  * 判断是否为空对象
16
16
  * @param value
@@ -28,31 +28,37 @@ export default class CrUtil {
28
28
  * @param value
29
29
  * @returns boolean
30
30
  */
31
- static isDate(value: any): boolean;
31
+ static isDate(value: unknown): boolean;
32
32
  /**
33
33
  * 判断是否为字符串
34
34
  * @param value
35
35
  * @returns boolean
36
36
  */
37
- static isString(value: any): value is string;
37
+ static isString(value: unknown): value is string;
38
38
  /**
39
39
  * 判断是否为数字
40
40
  * @param value
41
41
  * @returns boolean
42
42
  */
43
- static isNumber(value: any): value is number;
43
+ static isNumber(value: unknown): value is number;
44
44
  /**
45
45
  * 判断是否为文件 File
46
46
  * @param value
47
47
  * @returns boolean
48
48
  */
49
- static isFile(value: any): value is File;
49
+ static isFile(value: unknown): value is File;
50
50
  /**
51
51
  * 判断是否为 Boolean
52
52
  * @param value
53
53
  * @returns boolean
54
54
  */
55
- static isBoolean(value: any): value is boolean;
55
+ static isBoolean(value: unknown): value is boolean;
56
+ /**
57
+ * 判断是否为 Function
58
+ * @param value
59
+ * @returns boolean
60
+ */
61
+ static isFunction(value: unknown): value is (...args: any[]) => any;
56
62
  /**
57
63
  * 去掉字符串前后所有空格
58
64
  * @param str
@@ -65,9 +71,16 @@ export default class CrUtil {
65
71
  * @returns number
66
72
  */
67
73
  static getArrayDimension(arr: any[]): number;
74
+ /**
75
+ * 深拷贝
76
+ * @param value
77
+ * @returns
78
+ */
79
+ static cloneDeep<T>(value: T): T;
68
80
  /**
69
81
  * 深拷贝
70
82
  * @param target
83
+ * @deprecated 即将移除,使用 {@link CrUtil.cloneDeep} 替代
71
84
  * @returns
72
85
  */
73
86
  static deepCopy<T = any>(target: T): T;
@@ -78,6 +91,7 @@ export default class CrUtil {
78
91
  * @param settings.idField 默认值 id
79
92
  * @param settings.pidField 默认值 parentId
80
93
  * @param settings.childrenField 默认值 children
94
+ * @deprecated 即将移除,使用 {@link CrObjUtil.listToTree} 替代
81
95
  * @returns
82
96
  */
83
97
  static listToTreeData(listData: any[], settings?: {
@@ -94,6 +108,7 @@ export default class CrUtil {
94
108
  * @param settings.idField 默认值 id
95
109
  * @param settings.pidField 默认值 parentId
96
110
  * @param settings.childrenField 默认值 children
111
+ * @deprecated 即将移除,使用 {@link CrObjUtil.treeToList} 替代
97
112
  * @returns
98
113
  */
99
114
  static treeDataToListData(treeData: any[], pid?: string | number, settings?: {
@@ -110,6 +125,7 @@ export default class CrUtil {
110
125
  * @param settings.valueField 默认值 value
111
126
  * @param settings.idField 默认值 id
112
127
  * @param settings.pidField 默认值 parentId
128
+ * @deprecated 即将移除,使用 {@link CrObjUtil.getFlatParentDatas} 替代
113
129
  * @returns
114
130
  */
115
131
  static getParentNodes<T, R extends Record<string, any>>(listData: R[], value: number | string, settings?: {
@@ -135,6 +151,19 @@ export default class CrUtil {
135
151
  static paramsParse(str: string, settings?: {
136
152
  ignoreQueryPrefix: boolean;
137
153
  }): {};
154
+ /**
155
+ * 获取 URL 参数
156
+ * @param {*} url
157
+ * @returns
158
+ * @example
159
+ * "https://example.com?foo=bar&baz=qux" => {"query":{"foo":"bar","baz":"qux"},"hash":{},"all":{"foo":"bar","baz":"qux"}}
160
+ * "https://example.com/page?foo=1#/?a=1&b=2" => {"query":{"foo":"1"},"hash":{"/":"","a":"1","b":"2"},"all":{"foo":"1","/":"","a":"1","b":"2"}},
161
+ */
162
+ static getQueryParams(url: string): {
163
+ query: Record<string, any>;
164
+ hash: Record<string, any>;
165
+ all: Record<string, any>;
166
+ };
138
167
  /**
139
168
  * 版本号比较
140
169
  * @param v1
@@ -171,4 +200,10 @@ export default class CrUtil {
171
200
  * @returns
172
201
  */
173
202
  static compareDataDiff(data1: any, data2: any): Record<string, "added" | "removed" | "modified">;
203
+ /**
204
+ * 格式化为千分位
205
+ * @param value
206
+ * @returns 12345.6789 => 12,345.6789
207
+ */
208
+ static fmtThousands(value: number | string | undefined): string;
174
209
  }
package/dist/util.js CHANGED
@@ -18,6 +18,7 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+
18
18
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
19
19
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
20
20
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
21
+ import { cloneDeep as _cloneDeep } from 'lodash';
21
22
  import Qs from 'qs';
22
23
  var CrUtil = /*#__PURE__*/function () {
23
24
  function CrUtil() {
@@ -126,6 +127,17 @@ var CrUtil = /*#__PURE__*/function () {
126
127
  return Object.prototype.toString.call(value) === '[object Boolean]';
127
128
  }
128
129
 
130
+ /**
131
+ * 判断是否为 Function
132
+ * @param value
133
+ * @returns boolean
134
+ */
135
+ }, {
136
+ key: "isFunction",
137
+ value: function isFunction(value) {
138
+ return typeof value === 'function';
139
+ }
140
+
129
141
  /**
130
142
  * 去掉字符串前后所有空格
131
143
  * @param str
@@ -158,9 +170,21 @@ var CrUtil = /*#__PURE__*/function () {
158
170
  return maxDimension + 1;
159
171
  }
160
172
 
173
+ /**
174
+ * 深拷贝
175
+ * @param value
176
+ * @returns
177
+ */
178
+ }, {
179
+ key: "cloneDeep",
180
+ value: function cloneDeep(value) {
181
+ return _cloneDeep(value);
182
+ }
183
+
161
184
  /**
162
185
  * 深拷贝
163
186
  * @param target
187
+ * @deprecated 即将移除,使用 {@link CrUtil.cloneDeep} 替代
164
188
  * @returns
165
189
  */
166
190
  }, {
@@ -198,6 +222,7 @@ var CrUtil = /*#__PURE__*/function () {
198
222
  * @param settings.idField 默认值 id
199
223
  * @param settings.pidField 默认值 parentId
200
224
  * @param settings.childrenField 默认值 children
225
+ * @deprecated 即将移除,使用 {@link CrObjUtil.listToTree} 替代
201
226
  * @returns
202
227
  */
203
228
  }, {
@@ -307,6 +332,7 @@ var CrUtil = /*#__PURE__*/function () {
307
332
  * @param settings.idField 默认值 id
308
333
  * @param settings.pidField 默认值 parentId
309
334
  * @param settings.childrenField 默认值 children
335
+ * @deprecated 即将移除,使用 {@link CrObjUtil.treeToList} 替代
310
336
  * @returns
311
337
  */
312
338
  }, {
@@ -347,6 +373,7 @@ var CrUtil = /*#__PURE__*/function () {
347
373
  * @param settings.valueField 默认值 value
348
374
  * @param settings.idField 默认值 id
349
375
  * @param settings.pidField 默认值 parentId
376
+ * @deprecated 即将移除,使用 {@link CrObjUtil.getFlatParentDatas} 替代
350
377
  * @returns
351
378
  */
352
379
  }, {
@@ -400,12 +427,11 @@ var CrUtil = /*#__PURE__*/function () {
400
427
  isFilterNonNull: false
401
428
  }, settings);
402
429
  if (options.isFilterNonNull) {
403
- params = Object.fromEntries(Object.entries(params).filter(function (_ref) {
404
- var _ref2 = _slicedToArray(_ref, 2),
405
- k = _ref2[0],
406
- v = _ref2[1];
407
- return !(v === null || v === undefined || v === '');
408
- }));
430
+ Object.keys(params).forEach(function (key) {
431
+ if (params[key] === null || params[key] === undefined || params[key] === '') {
432
+ delete params[key];
433
+ }
434
+ });
409
435
  }
410
436
  return Qs.stringify(params);
411
437
  }
@@ -429,6 +455,72 @@ var CrUtil = /*#__PURE__*/function () {
429
455
  return obj;
430
456
  }
431
457
 
458
+ /**
459
+ * 获取 URL 参数
460
+ * @param {*} url
461
+ * @returns
462
+ * @example
463
+ * "https://example.com?foo=bar&baz=qux" => {"query":{"foo":"bar","baz":"qux"},"hash":{},"all":{"foo":"bar","baz":"qux"}}
464
+ * "https://example.com/page?foo=1#/?a=1&b=2" => {"query":{"foo":"1"},"hash":{"/":"","a":"1","b":"2"},"all":{"foo":"1","/":"","a":"1","b":"2"}},
465
+ */
466
+ }, {
467
+ key: "getQueryParams",
468
+ value: function getQueryParams(url) {
469
+ var query = {};
470
+ var hash = {};
471
+ var all = {};
472
+ var parse = function parse(queryString) {
473
+ if (!queryString) {
474
+ return {};
475
+ }
476
+ try {
477
+ return Qs.parse(queryString);
478
+ } catch (_unused) {
479
+ var result = {};
480
+ if (!queryString) return result;
481
+ queryString.split('&').forEach(function (pair) {
482
+ if (!pair) return;
483
+ var _pair$split = pair.split('='),
484
+ _pair$split2 = _slicedToArray(_pair$split, 2),
485
+ key = _pair$split2[0],
486
+ val = _pair$split2[1];
487
+ if (key) result[decodeURIComponent(key)] = decodeURIComponent(val || '');
488
+ });
489
+ return result;
490
+ }
491
+ };
492
+ try {
493
+ var _url$split = url.split('#'),
494
+ _url$split2 = _slicedToArray(_url$split, 2),
495
+ base = _url$split2[0],
496
+ hashPart = _url$split2[1];
497
+ var queryPart = base.split('?')[1];
498
+ Object.assign(query, parse(queryPart));
499
+ if (hashPart) {
500
+ var _iterator4 = _createForOfIteratorHelper(hashPart.split('?')),
501
+ _step4;
502
+ try {
503
+ for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
504
+ var part = _step4.value;
505
+ Object.assign(hash, parse(part));
506
+ }
507
+ } catch (err) {
508
+ _iterator4.e(err);
509
+ } finally {
510
+ _iterator4.f();
511
+ }
512
+ }
513
+ Object.assign(all, query, hash);
514
+ } catch (error) {
515
+ console.error('getQueryParams:', error);
516
+ }
517
+ return {
518
+ query: query,
519
+ hash: hash,
520
+ all: all
521
+ };
522
+ }
523
+
432
524
  /**
433
525
  * 版本号比较
434
526
  * @param v1
@@ -578,6 +670,25 @@ var CrUtil = /*#__PURE__*/function () {
578
670
  compare('', data1, data2);
579
671
  return diffFieldSet;
580
672
  }
673
+
674
+ /**
675
+ * 格式化为千分位
676
+ * @param value
677
+ * @returns 12345.6789 => 12,345.6789
678
+ */
679
+ }, {
680
+ key: "fmtThousands",
681
+ value: function fmtThousands(value) {
682
+ if (value == undefined || value == null || isNaN(Number(value))) {
683
+ return String(value);
684
+ }
685
+ var _String$split = String(value).split('.'),
686
+ _String$split2 = _slicedToArray(_String$split, 2),
687
+ intPart = _String$split2[0],
688
+ decimalPart = _String$split2[1];
689
+ var formattedInt = intPart.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
690
+ return decimalPart ? "".concat(formattedInt, ".").concat(decimalPart) : formattedInt;
691
+ }
581
692
  }]);
582
693
  return CrUtil;
583
694
  }();
@@ -0,0 +1,34 @@
1
+ # CrEventCenter 事件发布订阅
2
+
3
+ 事件发布订阅
4
+
5
+ - 推荐仅在原生 javascript 中使用
6
+ - 不推荐中在三大框架中使用,而是使用各家框架的状态管理库(存在问题,闭包函数未能及时更新 useState 中的值)
7
+
8
+ 原生写法
9
+
10
+ ```
11
+ import { CrEventCenter } from '@zcrkey/js-utils';
12
+ import type { TSubscription } from '@zcrkey/js-utils';
13
+
14
+ // 订阅事件
15
+ const subscription: TSubscription = CrEventCenter.on('xxx_xxx', (params) => {
16
+ console.log('params',params)
17
+ });
18
+
19
+ // 发布事件
20
+ CrEventCenter.emit('xxx_xxx',{a:1,b:2})
21
+
22
+ // 移除订阅事件
23
+ subscription.remove()
24
+ // 或者
25
+ CrEventCenter.off(subscription);
26
+
27
+ // 查找订阅事件
28
+ const item = CrEventCenter.find('xxx_xxx')
29
+
30
+ // 清除所有订阅事件
31
+ CrEventCenter.clear()
32
+
33
+
34
+ ```
@@ -0,0 +1,5 @@
1
+ ---
2
+ order: -1
3
+ ---
4
+
5
+ # API 总览
@@ -0,0 +1,9 @@
1
+ # CrStorage 浏览器存储
2
+
3
+ 浏览器存储
4
+
5
+ - localStorage:大小(10mb)、访问(任何窗口)
6
+ - sessionStorage 大小(5mb)、访问(同一窗口)
7
+
8
+ <code src="./local.tsx"></code>
9
+ <code src="./session.tsx"></code>
@@ -0,0 +1,91 @@
1
+ /**
2
+ * title: localStorage
3
+ */
4
+
5
+ import { CrStorage } from '@zcrkey/js-utils';
6
+ import React, { useState } from 'react';
7
+
8
+ const LOGIN_USER = 'loginUser';
9
+
10
+ export default () => {
11
+ const [data, setData] = useState<any>();
12
+
13
+ const onSet = () => {
14
+ // CrStorage.setLocalItem(LOGIN_USER, null);
15
+ // CrStorage.setLocalItem(LOGIN_USER, -1);
16
+ // CrStorage.setLocalItem(LOGIN_USER, undefined);
17
+ // CrStorage.setLocalItem(LOGIN_USER, {});
18
+ // CrStorage.setLocalItem(LOGIN_USER, []);
19
+ CrStorage.setLocalItem(LOGIN_USER, {
20
+ name: 'zcr',
21
+ sex: '男',
22
+ age: 18,
23
+ });
24
+ };
25
+
26
+ const onGet = () => {
27
+ const data = CrStorage.getLocalItem(LOGIN_USER);
28
+ setData(data);
29
+ };
30
+
31
+ const onClear = () => {
32
+ CrStorage.removeLocalItem(LOGIN_USER);
33
+ setData('');
34
+ };
35
+
36
+ const onAllClear = () => {
37
+ CrStorage.clearLocal();
38
+ setData('');
39
+ };
40
+
41
+ return (
42
+ <>
43
+ <div className="flex flex-direction">
44
+ <div className="text-lg">CrUtil.setLocalItem</div>
45
+ <div>
46
+ <button
47
+ type="button"
48
+ className="cr-btn line-blue radius"
49
+ onClick={onSet}
50
+ >
51
+ 设置用户数据
52
+ </button>
53
+ </div>
54
+ <div className="text-lg">CrUtil.getLocalItem</div>
55
+ <div>
56
+ <button
57
+ type="button"
58
+ className="cr-btn line-blue radius"
59
+ onClick={onGet}
60
+ >
61
+ 获取用户数据
62
+ </button>
63
+ </div>
64
+ <div className="text-lg">CrUtil.removeLocalItem</div>
65
+ <div>
66
+ <button
67
+ type="button"
68
+ className="cr-btn line-blue radius"
69
+ onClick={onClear}
70
+ >
71
+ 清除用户数据
72
+ </button>
73
+ </div>
74
+ </div>
75
+ <div className="text-lg">CrUtil.clearLocal</div>
76
+ <div>
77
+ <button
78
+ type="button"
79
+ className="cr-btn line-blue radius"
80
+ onClick={onAllClear}
81
+ >
82
+ 清除全部
83
+ </button>
84
+ </div>
85
+
86
+ <div className="divider"></div>
87
+
88
+ <p>用户数据:{JSON.stringify(data)}</p>
89
+ </>
90
+ );
91
+ };