@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.
- package/.dumi/global.less +1396 -0
- package/.dumirc.ts +36 -0
- package/.fatherrc.ts +14 -0
- package/.husky/commit-msg +4 -0
- package/.husky/pre-commit +4 -0
- package/.prettierignore +2 -0
- package/.stylelintrc +10 -0
- package/README.md +60 -56
- package/dist/index.d.ts +5 -1
- package/dist/index.js +2 -0
- package/dist/index.umd.js +1 -1
- package/dist/objUtil.d.ts +12 -0
- package/dist/objUtil.js +28 -0
- package/dist/treeUtil.d.ts +48 -0
- package/dist/treeUtil.js +185 -0
- package/dist/util.d.ts +41 -6
- package/dist/util.js +117 -6
- package/docs/api/eventCenter/index.md +34 -0
- package/docs/api/index.md +5 -0
- package/docs/api/storage/index.md +9 -0
- package/docs/api/storage/local.tsx +91 -0
- package/docs/api/storage/session.tsx +85 -0
- package/docs/api/treeUtil/index.md +5 -0
- package/docs/api/treeUtil/index.tsx +266 -0
- package/docs/api/util/index.md +6 -0
- package/docs/api/util/index.tsx +405 -0
- package/docs/api/util/is.tsx +196 -0
- package/docs/guide.md +24 -0
- package/package.json +3 -5
- package/src/eventCenter.ts +112 -0
- package/src/index.ts +8 -0
- package/src/objUtil.ts +20 -0
- package/src/storage.ts +101 -0
- package/src/treeUtil.ts +164 -0
- package/src/util.ts +656 -0
- package/tsconfig.json +18 -0
package/dist/treeUtil.js
ADDED
|
@@ -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
|
|
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:
|
|
31
|
+
static isDate(value: unknown): boolean;
|
|
32
32
|
/**
|
|
33
33
|
* 判断是否为字符串
|
|
34
34
|
* @param value
|
|
35
35
|
* @returns boolean
|
|
36
36
|
*/
|
|
37
|
-
static isString(value:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
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,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
|
+
};
|