uview-pro 0.1.0 → 0.2.0
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/changelog.md +459 -406
- package/components/common/props.ts +22 -0
- package/components/u-action-sheet/types.ts +35 -35
- package/components/u-action-sheet/u-action-sheet.vue +160 -160
- package/components/u-alert-tips/types.ts +39 -39
- package/components/u-alert-tips/u-alert-tips.vue +212 -212
- package/components/u-avatar/types.ts +34 -34
- package/components/u-avatar/u-avatar.vue +193 -193
- package/components/u-avatar-cropper/types.ts +23 -23
- package/components/u-avatar-cropper/u-avatar-cropper.vue +286 -286
- package/components/u-avatar-cropper/weCropper.d.ts +62 -62
- package/components/u-avatar-cropper/weCropper.js +1253 -1253
- package/components/u-avatar-cropper/weCropper.ts +1255 -1255
- package/components/u-back-top/types.ts +39 -39
- package/components/u-back-top/u-back-top.vue +125 -125
- package/components/u-badge/types.ts +36 -36
- package/components/u-badge/u-badge.vue +165 -165
- package/components/u-button/types.ts +66 -66
- package/components/u-button/u-button.vue +556 -556
- package/components/u-calendar/types.ts +63 -63
- package/components/u-calendar/u-calendar.vue +592 -592
- package/components/u-car-keyboard/types.ts +12 -12
- package/components/u-car-keyboard/u-car-keyboard.vue +234 -234
- package/components/u-card/types.ts +59 -59
- package/components/u-card/u-card.vue +194 -194
- package/components/u-cell-group/types.ts +17 -17
- package/components/u-cell-group/u-cell-group.vue +50 -50
- package/components/u-cell-item/types.ts +54 -54
- package/components/u-cell-item/u-cell-item.vue +202 -202
- package/components/u-checkbox/types.ts +31 -31
- package/components/u-checkbox/u-checkbox.vue +267 -267
- package/components/u-checkbox-group/types.ts +32 -32
- package/components/u-checkbox-group/u-checkbox-group.vue +79 -79
- package/components/u-circle-progress/types.ts +52 -52
- package/components/u-circle-progress/u-circle-progress.vue +187 -187
- package/components/u-city-select/types.ts +20 -20
- package/components/u-city-select/u-city-select.vue +236 -236
- package/components/u-col/types.ts +30 -30
- package/components/u-col/u-col.vue +123 -123
- package/components/u-collapse/types.ts +33 -31
- package/components/u-collapse/u-collapse.vue +69 -68
- package/components/u-collapse-item/types.ts +27 -25
- package/components/u-collapse-item/u-collapse-item.vue +201 -194
- package/components/u-column-notice/types.ts +48 -48
- package/components/u-column-notice/u-column-notice.vue +176 -176
- package/components/u-count-down/types.ts +42 -42
- package/components/u-count-down/u-count-down.vue +258 -258
- package/components/u-count-to/types.ts +32 -32
- package/components/u-count-to/u-count-to.vue +241 -241
- package/components/u-divider/types.ts +31 -31
- package/components/u-divider/u-divider.vue +121 -121
- package/components/u-dropdown/types.ts +32 -32
- package/components/u-dropdown/u-dropdown.vue +289 -289
- package/components/u-dropdown-item/types.ts +27 -27
- package/components/u-dropdown-item/u-dropdown-item.vue +123 -123
- package/components/u-empty/types.ts +36 -36
- package/components/u-empty/u-empty.vue +88 -88
- package/components/u-field/types.ts +69 -69
- package/components/u-field/u-field.vue +354 -354
- package/components/u-form/u-form.vue +132 -132
- package/components/u-form-item/u-form-item.vue +417 -417
- package/components/u-full-screen/types.ts +14 -14
- package/components/u-full-screen/u-full-screen.vue +82 -82
- package/components/u-gap/types.ts +18 -18
- package/components/u-gap/u-gap.vue +40 -40
- package/components/u-grid/types.ts +19 -19
- package/components/u-grid/u-grid.vue +93 -93
- package/components/u-grid-item/types.ts +16 -16
- package/components/u-grid-item/u-grid-item.vue +130 -130
- package/components/u-icon/types.ts +62 -62
- package/components/u-icon/u-icon.vue +281 -274
- package/components/u-image/types.ts +51 -51
- package/components/u-image/u-image.vue +222 -222
- package/components/u-index-anchor/types.ts +16 -16
- package/components/u-index-anchor/u-index-anchor.vue +86 -86
- package/components/u-index-list/types.ts +43 -43
- package/components/u-index-list/u-index-list.vue +355 -355
- package/components/u-input/types.ts +140 -140
- package/components/u-input/u-input.vue +264 -255
- package/components/u-keyboard/types.ts +40 -40
- package/components/u-keyboard/u-keyboard.vue +158 -158
- package/components/u-lazy-load/types.ts +37 -37
- package/components/u-lazy-load/u-lazy-load.vue +233 -233
- package/components/u-line/types.ts +44 -44
- package/components/u-line/u-line.vue +59 -59
- package/components/u-line-progress/types.ts +58 -58
- package/components/u-line-progress/u-line-progress.vue +109 -109
- package/components/u-link/types.ts +43 -43
- package/components/u-link/u-link.vue +75 -75
- package/components/u-loading/types.ts +35 -35
- package/components/u-loading/u-loading.vue +90 -90
- package/components/u-loading-popup/types.ts +26 -26
- package/components/u-loading-popup/u-loading-popup.vue +239 -239
- package/components/u-loadmore/types.ts +79 -79
- package/components/u-loadmore/u-loadmore.vue +140 -140
- package/components/u-mask/types.ts +43 -43
- package/components/u-mask/u-mask.vue +106 -106
- package/components/u-message-input/types.ts +74 -74
- package/components/u-message-input/u-message-input.vue +255 -255
- package/components/u-modal/types.ts +118 -118
- package/components/u-modal/u-modal.vue +204 -204
- package/components/u-navbar/types.ts +103 -103
- package/components/u-navbar/u-navbar.vue +226 -226
- package/components/u-no-network/image.ts +2 -2
- package/components/u-no-network/types.ts +28 -28
- package/components/u-no-network/u-no-network.vue +290 -290
- package/components/u-notice-bar/types.ts +111 -111
- package/components/u-notice-bar/u-notice-bar.vue +174 -174
- package/components/u-number-box/types.ts +42 -42
- package/components/u-number-box/u-number-box.vue +312 -312
- package/components/u-number-keyboard/types.ts +26 -26
- package/components/u-number-keyboard/u-number-keyboard.vue +166 -166
- package/components/u-picker/types.ts +123 -123
- package/components/u-picker/u-picker.vue +637 -637
- package/components/u-popup/types.ts +59 -59
- package/components/u-popup/u-popup.vue +359 -359
- package/components/u-radio/types.ts +25 -25
- package/components/u-radio/u-radio.vue +258 -258
- package/components/u-radio-group/types.ts +29 -29
- package/components/u-radio-group/u-radio-group.vue +98 -98
- package/components/u-rate/types.ts +40 -40
- package/components/u-rate/u-rate.vue +234 -234
- package/components/u-read-more/types.ts +35 -35
- package/components/u-read-more/u-read-more.vue +150 -150
- package/components/u-row/types.ts +20 -20
- package/components/u-row/u-row.vue +87 -87
- package/components/u-row-notice/types.ts +39 -39
- package/components/u-row-notice/u-row-notice.vue +213 -213
- package/components/u-safe-bottom/u-safe-bottom.vue +46 -46
- package/components/u-search/types.ts +53 -53
- package/components/u-search/u-search.vue +256 -256
- package/components/u-section/types.ts +32 -32
- package/components/u-section/u-section.vue +125 -125
- package/components/u-select/types.ts +43 -43
- package/components/u-select/u-select.vue +361 -361
- package/components/u-skeleton/types.ts +20 -20
- package/components/u-skeleton/u-skeleton.vue +205 -205
- package/components/u-slider/types.ts +32 -32
- package/components/u-slider/u-slider.vue +238 -238
- package/components/u-status-bar/u-status-bar.vue +65 -65
- package/components/u-steps/types.ts +28 -28
- package/components/u-steps/u-steps.vue +160 -160
- package/components/u-sticky/types.ts +22 -22
- package/components/u-sticky/u-sticky.vue +159 -159
- package/components/u-subsection/types.ts +36 -36
- package/components/u-subsection/u-subsection.vue +328 -328
- package/components/u-swipe-action/types.ts +50 -50
- package/components/u-swipe-action/u-swipe-action.vue +253 -253
- package/components/u-swiper/types.ts +47 -47
- package/components/u-swiper/u-swiper.vue +266 -266
- package/components/u-switch/types.ts +28 -28
- package/components/u-switch/u-switch.vue +136 -136
- package/components/u-tabbar/types.ts +36 -36
- package/components/u-tabbar/u-tabbar.vue +280 -280
- package/components/u-table/types.ts +25 -25
- package/components/u-table/u-table.vue +55 -55
- package/components/u-tabs/types.ts +51 -51
- package/components/u-tabs/u-tabs.vue +284 -284
- package/components/u-tabs-swiper/types.ts +53 -53
- package/components/u-tabs-swiper/u-tabs-swiper.vue +379 -379
- package/components/u-tag/types.ts +37 -37
- package/components/u-tag/u-tag.vue +244 -244
- package/components/u-td/types.ts +12 -12
- package/components/u-td/u-td.vue +87 -87
- package/components/u-text/types.ts +69 -0
- package/components/u-text/u-text.vue +326 -0
- package/components/u-th/types.ts +12 -12
- package/components/u-th/u-th.vue +81 -81
- package/components/u-time-line/u-time-line.vue +39 -39
- package/components/u-time-line-item/types.ts +14 -14
- package/components/u-time-line-item/u-time-line-item.vue +78 -78
- package/components/u-toast/types.ts +36 -36
- package/components/u-toast/u-toast.vue +233 -233
- package/components/u-top-tips/types.ts +14 -14
- package/components/u-top-tips/u-top-tips.vue +113 -113
- package/components/u-tr/types.ts +8 -8
- package/components/u-tr/u-tr.vue +24 -24
- package/components/u-upload/types.ts +74 -74
- package/components/u-upload/u-upload.vue +545 -545
- package/components/u-verification-code/types.ts +22 -22
- package/components/u-verification-code/u-verification-code.vue +164 -164
- package/components/u-waterfall/types.ts +16 -16
- package/components/u-waterfall/u-waterfall.vue +175 -175
- package/iconfont.css +912 -912
- package/index.scss +25 -23
- package/index.ts +29 -204
- package/libs/config/config.ts +26 -26
- package/libs/config/zIndex.ts +37 -37
- package/libs/css/color.scss +155 -155
- package/libs/css/common.scss +178 -178
- package/libs/css/style.components.scss +16 -7
- package/libs/css/style.h5.scss +8 -8
- package/libs/css/style.mp.scss +72 -72
- package/libs/css/style.nvue.scss +15 -3
- package/libs/css/style.vue.scss +188 -177
- package/libs/function/$parent.ts +21 -21
- package/libs/function/addUnit.ts +13 -13
- package/libs/function/color.ts +37 -71
- package/libs/function/colorGradient.ts +125 -125
- package/libs/function/debounce.ts +28 -28
- package/libs/function/deepClone.ts +39 -39
- package/libs/function/deepMerge.ts +34 -34
- package/libs/function/getParent.ts +59 -59
- package/libs/function/getRect.ts +26 -26
- package/libs/function/guid.ts +42 -42
- package/libs/function/md5.ts +391 -391
- package/libs/function/parent.ts +21 -21
- package/libs/function/queryParams.ts +60 -60
- package/libs/function/random.ts +16 -16
- package/libs/function/randomArray.ts +11 -11
- package/libs/function/route.ts +118 -118
- package/libs/function/styleUtils.ts +83 -83
- package/libs/function/sys.ts +15 -15
- package/libs/function/test.ts +285 -229
- package/libs/function/throttle.ts +31 -31
- package/libs/function/timeFormat.ts +54 -54
- package/libs/function/timeFrom.ts +48 -48
- package/libs/function/toast.ts +14 -14
- package/libs/function/trim.ts +21 -21
- package/libs/function/type2icon.ts +36 -36
- package/libs/hooks/index.ts +3 -0
- package/libs/hooks/useEmitter.ts +77 -77
- package/libs/hooks/useParent.ts +31 -29
- package/libs/hooks/useRect.ts +33 -0
- package/libs/index.ts +291 -0
- package/libs/request/auto-http.ts +76 -76
- package/libs/request/index.ts +223 -223
- package/libs/store/index.ts +88 -88
- package/libs/util/area.ts +3771 -3771
- package/libs/util/async-validator.d.ts +62 -62
- package/libs/util/async-validator.js +1368 -1368
- package/libs/util/city.ts +432 -432
- package/libs/util/emitter.ts +102 -102
- package/libs/util/mitt.ts +115 -115
- package/libs/util/parent.ts +20 -20
- package/libs/util/province.ts +37 -37
- package/package.json +1 -1
- package/readme.md +237 -237
- package/theme.scss +38 -38
- package/types/components.d.ts +96 -95
- package/types/global.d.ts +255 -221
- package/types/ignore-errors.d.ts +30 -30
- package/types/index.d.ts +19 -90
- package/types/uni-app.d.ts +63 -63
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
// 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法
|
|
2
|
-
// this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx
|
|
3
|
-
interface VueInstance {
|
|
4
|
-
$parent?: VueInstance;
|
|
5
|
-
$options?: { name?: string };
|
|
6
|
-
[key: string]: any;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* 获取父组件参数
|
|
11
|
-
* @param this 当前组件实例
|
|
12
|
-
* @param name 父组件name
|
|
13
|
-
* @param keys 需要获取的参数名数组或对象
|
|
14
|
-
* @returns 父组件参数对象
|
|
15
|
-
*/
|
|
16
|
-
export default function getParent(this: VueInstance, name: string, keys: string[] | Record<string, any>): Record<string, any> {
|
|
17
|
-
let parent = this.$parent;
|
|
18
|
-
// 通过while历遍,这里主要是为了H5需要多层解析的问题
|
|
19
|
-
while (parent) {
|
|
20
|
-
// 父组件
|
|
21
|
-
if (parent.$options?.name !== name) {
|
|
22
|
-
// 如果组件的name不相等,继续上一级寻找
|
|
23
|
-
parent = parent.$parent;
|
|
24
|
-
} else {
|
|
25
|
-
const data: Record<string, any> = {};
|
|
26
|
-
// 判断keys是否数组,如果传过来的是一个数组,那么直接使用数组元素值当做键值去父组件寻找
|
|
27
|
-
if (Array.isArray(keys)) {
|
|
28
|
-
keys.forEach(val => {
|
|
29
|
-
data[val] = parent?.[val] ? parent[val] : '';
|
|
30
|
-
});
|
|
31
|
-
} else {
|
|
32
|
-
// 历遍传过来的对象参数
|
|
33
|
-
for (const i in keys) {
|
|
34
|
-
// 如果子组件有此值则用,无此值则用父组件的值
|
|
35
|
-
// 判断是否空数组,如果是,则用父组件的值,否则用子组件的值
|
|
36
|
-
if (Array.isArray(keys[i])) {
|
|
37
|
-
if (keys[i].length) {
|
|
38
|
-
data[i] = keys[i];
|
|
39
|
-
} else {
|
|
40
|
-
data[i] = parent[i];
|
|
41
|
-
}
|
|
42
|
-
} else if (keys[i] && keys[i].constructor === Object) {
|
|
43
|
-
// 判断是否对象,如果是对象,且有属性,那么使用子组件的值,否则使用父组件的值
|
|
44
|
-
if (Object.keys(keys[i]).length) {
|
|
45
|
-
data[i] = keys[i];
|
|
46
|
-
} else {
|
|
47
|
-
data[i] = parent[i];
|
|
48
|
-
}
|
|
49
|
-
} else {
|
|
50
|
-
// 只要子组件有传值,即使是false值,也是“传值”了,也需要覆盖父组件的同名参数
|
|
51
|
-
data[i] = keys[i] || keys[i] === false ? keys[i] : parent[i];
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
return data;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return {};
|
|
59
|
-
}
|
|
1
|
+
// 获取父组件的参数,因为支付宝小程序不支持provide/inject的写法
|
|
2
|
+
// this.$parent在非H5中,可以准确获取到父组件,但是在H5中,需要多次this.$parent.$parent.xxx
|
|
3
|
+
interface VueInstance {
|
|
4
|
+
$parent?: VueInstance;
|
|
5
|
+
$options?: { name?: string };
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 获取父组件参数
|
|
11
|
+
* @param this 当前组件实例
|
|
12
|
+
* @param name 父组件name
|
|
13
|
+
* @param keys 需要获取的参数名数组或对象
|
|
14
|
+
* @returns 父组件参数对象
|
|
15
|
+
*/
|
|
16
|
+
export default function getParent(this: VueInstance, name: string, keys: string[] | Record<string, any>): Record<string, any> {
|
|
17
|
+
let parent = this.$parent;
|
|
18
|
+
// 通过while历遍,这里主要是为了H5需要多层解析的问题
|
|
19
|
+
while (parent) {
|
|
20
|
+
// 父组件
|
|
21
|
+
if (parent.$options?.name !== name) {
|
|
22
|
+
// 如果组件的name不相等,继续上一级寻找
|
|
23
|
+
parent = parent.$parent;
|
|
24
|
+
} else {
|
|
25
|
+
const data: Record<string, any> = {};
|
|
26
|
+
// 判断keys是否数组,如果传过来的是一个数组,那么直接使用数组元素值当做键值去父组件寻找
|
|
27
|
+
if (Array.isArray(keys)) {
|
|
28
|
+
keys.forEach(val => {
|
|
29
|
+
data[val] = parent?.[val] ? parent[val] : '';
|
|
30
|
+
});
|
|
31
|
+
} else {
|
|
32
|
+
// 历遍传过来的对象参数
|
|
33
|
+
for (const i in keys) {
|
|
34
|
+
// 如果子组件有此值则用,无此值则用父组件的值
|
|
35
|
+
// 判断是否空数组,如果是,则用父组件的值,否则用子组件的值
|
|
36
|
+
if (Array.isArray(keys[i])) {
|
|
37
|
+
if (keys[i].length) {
|
|
38
|
+
data[i] = keys[i];
|
|
39
|
+
} else {
|
|
40
|
+
data[i] = parent[i];
|
|
41
|
+
}
|
|
42
|
+
} else if (keys[i] && keys[i].constructor === Object) {
|
|
43
|
+
// 判断是否对象,如果是对象,且有属性,那么使用子组件的值,否则使用父组件的值
|
|
44
|
+
if (Object.keys(keys[i]).length) {
|
|
45
|
+
data[i] = keys[i];
|
|
46
|
+
} else {
|
|
47
|
+
data[i] = parent[i];
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
// 只要子组件有传值,即使是false值,也是“传值”了,也需要覆盖父组件的同名参数
|
|
51
|
+
data[i] = keys[i] || keys[i] === false ? keys[i] : parent[i];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return data;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return {};
|
|
59
|
+
}
|
package/libs/function/getRect.ts
CHANGED
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 获取元素的位置信息
|
|
3
|
-
* @param {any} selector 选择器
|
|
4
|
-
* @param {boolean} all 是否获取所有匹配元素
|
|
5
|
-
* @returns {Promise<any>} 返回一个 Promise,解析为元素的位置信息
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { getCurrentInstance } from 'vue';
|
|
9
|
-
|
|
10
|
-
export default function (selector: any, _instance: any = null, all: boolean = false): Promise<any> {
|
|
11
|
-
const instance = _instance || getCurrentInstance();
|
|
12
|
-
return new Promise(resolve => {
|
|
13
|
-
uni.createSelectorQuery()
|
|
14
|
-
.in(instance?.proxy)
|
|
15
|
-
[all ? 'selectAll' : 'select'](selector)
|
|
16
|
-
.boundingClientRect((rect: any) => {
|
|
17
|
-
if (all && Array.isArray(rect) && rect.length) {
|
|
18
|
-
resolve(rect);
|
|
19
|
-
}
|
|
20
|
-
if (!all && rect) {
|
|
21
|
-
resolve(rect);
|
|
22
|
-
}
|
|
23
|
-
})
|
|
24
|
-
.exec();
|
|
25
|
-
});
|
|
26
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* 获取元素的位置信息
|
|
3
|
+
* @param {any} selector 选择器
|
|
4
|
+
* @param {boolean} all 是否获取所有匹配元素
|
|
5
|
+
* @returns {Promise<any>} 返回一个 Promise,解析为元素的位置信息
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { getCurrentInstance } from 'vue';
|
|
9
|
+
|
|
10
|
+
export default function (selector: any, _instance: any = null, all: boolean = false): Promise<any> {
|
|
11
|
+
const instance = _instance || getCurrentInstance();
|
|
12
|
+
return new Promise(resolve => {
|
|
13
|
+
uni.createSelectorQuery()
|
|
14
|
+
.in(instance?.proxy)
|
|
15
|
+
[all ? 'selectAll' : 'select'](selector)
|
|
16
|
+
.boundingClientRect((rect: any) => {
|
|
17
|
+
if (all && Array.isArray(rect) && rect.length) {
|
|
18
|
+
resolve(rect);
|
|
19
|
+
}
|
|
20
|
+
if (!all && rect) {
|
|
21
|
+
resolve(rect);
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
.exec();
|
|
25
|
+
});
|
|
26
|
+
}
|
package/libs/function/guid.ts
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 本算法来源于简书开源代码,详见:https://www.jianshu.com/p/fdbf293d0a85
|
|
3
|
-
* 全局唯一标识符(uuid,Globally Unique Identifier),也称作 uuid(Universally Unique IDentifier)
|
|
4
|
-
* 一般用于多个组件之间,给它一个唯一的标识符,或者v-for循环的时候,如果使用数组的index可能会导致更新列表出现问题
|
|
5
|
-
* 最可能的情况是左滑删除item或者对某条信息流"不喜欢"并去掉它的时候,会导致组件内的数据可能出现错乱
|
|
6
|
-
* v-for的时候,推荐使用后端返回的id而不是循环的index
|
|
7
|
-
* @param len uuid的长度,默认32
|
|
8
|
-
* @param firstU 将返回的首字母置为"u",默认true
|
|
9
|
-
* @param radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制
|
|
10
|
-
* @returns 生成的uuid字符串
|
|
11
|
-
*/
|
|
12
|
-
function guid(len: number = 32, firstU: boolean = true, radix?: number): string {
|
|
13
|
-
const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
|
|
14
|
-
const uuid: string[] = [];
|
|
15
|
-
const base = radix || chars.length;
|
|
16
|
-
|
|
17
|
-
if (len) {
|
|
18
|
-
// 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
|
|
19
|
-
for (let i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * base)];
|
|
20
|
-
} else {
|
|
21
|
-
let r: number;
|
|
22
|
-
// rfc4122标准要求返回的uuid中,某些位为固定的字符
|
|
23
|
-
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
|
|
24
|
-
uuid[14] = '4';
|
|
25
|
-
|
|
26
|
-
for (let i = 0; i < 36; i++) {
|
|
27
|
-
if (!uuid[i]) {
|
|
28
|
-
r = 0 | (Math.random() * 16);
|
|
29
|
-
uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r];
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
// 移除第一个字符,并用u替代,因为第一个字符为数值时,该guid不能用作id或者class
|
|
34
|
-
if (firstU) {
|
|
35
|
-
uuid.shift();
|
|
36
|
-
return 'u' + uuid.join('');
|
|
37
|
-
} else {
|
|
38
|
-
return uuid.join('');
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export default guid;
|
|
1
|
+
/**
|
|
2
|
+
* 本算法来源于简书开源代码,详见:https://www.jianshu.com/p/fdbf293d0a85
|
|
3
|
+
* 全局唯一标识符(uuid,Globally Unique Identifier),也称作 uuid(Universally Unique IDentifier)
|
|
4
|
+
* 一般用于多个组件之间,给它一个唯一的标识符,或者v-for循环的时候,如果使用数组的index可能会导致更新列表出现问题
|
|
5
|
+
* 最可能的情况是左滑删除item或者对某条信息流"不喜欢"并去掉它的时候,会导致组件内的数据可能出现错乱
|
|
6
|
+
* v-for的时候,推荐使用后端返回的id而不是循环的index
|
|
7
|
+
* @param len uuid的长度,默认32
|
|
8
|
+
* @param firstU 将返回的首字母置为"u",默认true
|
|
9
|
+
* @param radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制
|
|
10
|
+
* @returns 生成的uuid字符串
|
|
11
|
+
*/
|
|
12
|
+
function guid(len: number = 32, firstU: boolean = true, radix?: number): string {
|
|
13
|
+
const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
|
|
14
|
+
const uuid: string[] = [];
|
|
15
|
+
const base = radix || chars.length;
|
|
16
|
+
|
|
17
|
+
if (len) {
|
|
18
|
+
// 如果指定uuid长度,只是取随机的字符,0|x为位运算,能去掉x的小数位,返回整数位
|
|
19
|
+
for (let i = 0; i < len; i++) uuid[i] = chars[0 | (Math.random() * base)];
|
|
20
|
+
} else {
|
|
21
|
+
let r: number;
|
|
22
|
+
// rfc4122标准要求返回的uuid中,某些位为固定的字符
|
|
23
|
+
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
|
|
24
|
+
uuid[14] = '4';
|
|
25
|
+
|
|
26
|
+
for (let i = 0; i < 36; i++) {
|
|
27
|
+
if (!uuid[i]) {
|
|
28
|
+
r = 0 | (Math.random() * 16);
|
|
29
|
+
uuid[i] = chars[i == 19 ? (r & 0x3) | 0x8 : r];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// 移除第一个字符,并用u替代,因为第一个字符为数值时,该guid不能用作id或者class
|
|
34
|
+
if (firstU) {
|
|
35
|
+
uuid.shift();
|
|
36
|
+
return 'u' + uuid.join('');
|
|
37
|
+
} else {
|
|
38
|
+
return uuid.join('');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export default guid;
|