@gmcb/uv-ui 0.2.27 → 0.3.1
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 +8 -0
- package/LICENSE +21 -0
- package/README.md +95 -141
- package/docs/api/configs/color.md +52 -0
- package/docs/api/index.md +77 -0
- package/docs/api/mixins/mpShare.md +95 -0
- package/docs/api/request/apiManage.md +88 -0
- package/docs/api/request/http.md +451 -0
- package/docs/api/utils/colorSwitch.md +78 -0
- package/docs/api/utils/debounce.md +104 -0
- package/docs/api/utils/fastUse.md +246 -0
- package/docs/api/utils/getRect.md +238 -0
- package/docs/api/utils/guid.md +41 -0
- package/docs/api/utils/index.md +55 -0
- package/docs/api/utils/intro.md +25 -0
- package/docs/api/utils/object.md +171 -0
- package/docs/api/utils/queryParams.md +68 -0
- package/docs/api/utils/random.md +23 -0
- package/docs/api/utils/randomArray.md +28 -0
- package/docs/api/utils/route.md +121 -0
- package/docs/api/utils/test.md +237 -0
- package/docs/api/utils/time.md +81 -0
- package/docs/api/utils/trim.md +24 -0
- package/docs/components/actionSheet.md +236 -0
- package/docs/components/addQQGroup.md +5 -0
- package/docs/components/album.md +91 -0
- package/docs/components/alert.md +83 -0
- package/docs/components/avatar.md +152 -0
- package/docs/components/backTop.md +181 -0
- package/docs/components/badge.md +117 -0
- package/docs/components/button.md +196 -0
- package/docs/components/calendar.md +398 -0
- package/docs/components/calendars.md +294 -0
- package/docs/components/cell.md +185 -0
- package/docs/components/checkbox.md +281 -0
- package/docs/components/circleProgress.md +5 -0
- package/docs/components/code.md +162 -0
- package/docs/components/codeInput.md +175 -0
- package/docs/components/collapse.md +250 -0
- package/docs/components/color.md +324 -0
- package/docs/components/common.md +126 -0
- package/docs/components/countDown.md +166 -0
- package/docs/components/countTo.md +140 -0
- package/docs/components/datetimePicker.md +283 -0
- package/docs/components/diff1.x.md +190 -0
- package/docs/components/divider.md +88 -0
- package/docs/components/downloadSetting.md +54 -0
- package/docs/components/dropDown.md +375 -0
- package/docs/components/empty.md +99 -0
- package/docs/components/feature.md +261 -0
- package/docs/components/form.md +736 -0
- package/docs/components/gap.md +49 -0
- package/docs/components/grid.md +225 -0
- package/docs/components/icon.md +101 -0
- package/docs/components/image.md +182 -0
- package/docs/components/index.md +110 -0
- package/docs/components/indexList.md +133 -0
- package/docs/components/input.md +250 -0
- package/docs/components/install.md +59 -0
- package/docs/components/intro.md +32 -0
- package/docs/components/keyboard.md +226 -0
- package/docs/components/layout.md +310 -0
- package/docs/components/line.md +85 -0
- package/docs/components/lineProgress.md +141 -0
- package/docs/components/link.md +89 -0
- package/docs/components/list.md +223 -0
- package/docs/components/loadMore.md +140 -0
- package/docs/components/loadingIcon.md +144 -0
- package/docs/components/loadingPage.md +92 -0
- package/docs/components/modal.md +230 -0
- package/docs/components/more.md +13 -0
- package/docs/components/navbar.md +192 -0
- package/docs/components/noNetwork.md +116 -0
- package/docs/components/noticeBar.md +131 -0
- package/docs/components/notify.md +204 -0
- package/docs/components/npmSetting.md +64 -0
- package/docs/components/numberBox.md +257 -0
- package/docs/components/nvue.md +170 -0
- package/docs/components/overlay.md +117 -0
- package/docs/components/parse.md +204 -0
- package/docs/components/pickColor.md +112 -0
- package/docs/components/picker.md +357 -0
- package/docs/components/popup.md +221 -0
- package/docs/components/problem.md +300 -0
- package/docs/components/qrcode.md +169 -0
- package/docs/components/quickstart.md +33 -0
- package/docs/components/radio.md +256 -0
- package/docs/components/rate.md +128 -0
- package/docs/components/read.md +163 -0
- package/docs/components/readMore.md +227 -0
- package/docs/components/resource.md +17 -0
- package/docs/components/scrollList.md +218 -0
- package/docs/components/search.md +160 -0
- package/docs/components/setting.md +111 -0
- package/docs/components/settingDesc.md +66 -0
- package/docs/components/skeleton.md +105 -0
- package/docs/components/skeletons.md +323 -0
- package/docs/components/slider.md +157 -0
- package/docs/components/steps.md +189 -0
- package/docs/components/sticky.md +76 -0
- package/docs/components/subsection.md +183 -0
- package/docs/components/swipeAction.md +279 -0
- package/docs/components/swiper.md +352 -0
- package/docs/components/switch.md +216 -0
- package/docs/components/tabbar.md +263 -0
- package/docs/components/table.md +5 -0
- package/docs/components/tabs.md +364 -0
- package/docs/components/tag.md +227 -0
- package/docs/components/testPic.md +20 -0
- package/docs/components/text.md +157 -0
- package/docs/components/textarea.md +121 -0
- package/docs/components/toast.md +124 -0
- package/docs/components/tooltip.md +98 -0
- package/docs/components/transition.md +404 -0
- package/docs/components/upload.md +253 -0
- package/docs/components/vtabs.md +332 -0
- package/docs/components/vueUse.md +45 -0
- package/docs/components/vuexDetail.md +103 -0
- package/docs/components/waterfall.md +651 -0
- package/docs/faq/index.md +53 -0
- package/docs/guide/codeHint.md +44 -0
- package/docs/guide/customIcon.md +168 -0
- package/docs/guide/demo.md +92 -0
- package/docs/guide/design.md +56 -0
- package/docs/guide/globalVariable.md +239 -0
- package/docs/guide/i18n.md +194 -0
- package/docs/guide/index.md +28 -0
- package/docs/guide/note.md +74 -0
- package/docs/guide/safeAreaInset.md +64 -0
- package/docs/guide/theme.md +67 -0
- package/docs/index.md +88 -0
- package/libs/config/config.js +0 -10
- package/libs/css/color.scss +15 -14
- package/package.json +7 -2
- package/theme.scss +2 -1
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
# 使用该功能前,请按照[扩展配置](https://www.uvui.cn/components/setting.html)进行配置后即可正常使用。
|
|
2
|
+
|
|
3
|
+
## 示例项目
|
|
4
|
+
|
|
5
|
+
#### `uv-ui` 项目中有相关使用的代码,可以下载示例进行查看:[https://ext.dcloud.net.cn/plugin?id=12287](https://ext.dcloud.net.cn/plugin?id=12287)
|
|
6
|
+
|
|
7
|
+
## Http请求
|
|
8
|
+
|
|
9
|
+
**如果你已经很熟悉相关介绍,可以直接到实践中查看:[实践](/api/request/http.html#实践)**
|
|
10
|
+
|
|
11
|
+
该插件适用于普遍的请求场景,支持`post`、`get`、`put`和`delete`,以及上传下载等请求,有如下特点:
|
|
12
|
+
- 基于`Promise`对象实现更简单的`request`使用方式,支持请求和响应拦截
|
|
13
|
+
- 支持全局挂载
|
|
14
|
+
- 支持多个全局配置实例
|
|
15
|
+
- 支持自定义验证器
|
|
16
|
+
- 支持文件上传/下载
|
|
17
|
+
- 支持task 操作
|
|
18
|
+
- 支持自定义参数
|
|
19
|
+
- 支持多拦截器
|
|
20
|
+
- 对参数的处理比`uni.request`更强
|
|
21
|
+
|
|
22
|
+
### 平台差异说明
|
|
23
|
+
|
|
24
|
+
|App|H5|微信小程序|支付宝小程序|百度小程序|头条小程序|QQ小程序|
|
|
25
|
+
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|
|
26
|
+
|√|√|√|√|√|√|√|
|
|
27
|
+
|
|
28
|
+
:::tip 说明
|
|
29
|
+
此插件集成自优秀的开源请求库:[luch-request](https://www.quanzhan.co/luch-request/)。uv-ui对其进行了简单封装以及说明,如有不全之处,
|
|
30
|
+
可参考[luch-request](https://www.quanzhan.co/luch-request/)官方文档。
|
|
31
|
+
:::
|
|
32
|
+
|
|
33
|
+
### 基本使用
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
uni.$uv.http.middleware(config)
|
|
37
|
+
uni.$uv.http.request(config)
|
|
38
|
+
uni.$uv.http.get(url[, config])
|
|
39
|
+
uni.$uv.http.upload(url[, config])
|
|
40
|
+
uni.$uv.http.delete(url[, data[, config]])
|
|
41
|
+
uni.$uv.http.head(url[, data[, config]])
|
|
42
|
+
uni.$uv.http.post(url[, data[, config]])
|
|
43
|
+
uni.$uv.http.put(url[, data[, config]])
|
|
44
|
+
uni.$uv.http.connect(url[, data[, config]])
|
|
45
|
+
uni.$uv.http.options(url[, data[, config]])
|
|
46
|
+
uni.$uv.http.trace(url[, data[, config]])
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 全局配置
|
|
50
|
+
可选的配置项有如下:
|
|
51
|
+
```js
|
|
52
|
+
{
|
|
53
|
+
baseURL: '',
|
|
54
|
+
header: {},
|
|
55
|
+
method: 'GET',
|
|
56
|
+
dataType: 'json',
|
|
57
|
+
// #ifndef MP-ALIPAY
|
|
58
|
+
responseType: 'text',
|
|
59
|
+
// #endif
|
|
60
|
+
// 注:如果局部custom与全局custom有同名属性,则后面的属性会覆盖前面的属性,相当于Object.assign(全局,局部)
|
|
61
|
+
custom: {}, // 全局自定义参数默认值
|
|
62
|
+
// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
|
|
63
|
+
timeout: 60000,
|
|
64
|
+
// #endif
|
|
65
|
+
// #ifdef APP-PLUS
|
|
66
|
+
sslVerify: true,
|
|
67
|
+
// #endif
|
|
68
|
+
// #ifdef H5
|
|
69
|
+
// 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+)
|
|
70
|
+
withCredentials: false,
|
|
71
|
+
// #endif
|
|
72
|
+
// #ifdef APP-PLUS
|
|
73
|
+
firstIpv4: false, // DNS解析时优先使用ipv4 仅 App-Android 支持 (HBuilderX 2.8.0+)
|
|
74
|
+
// #endif
|
|
75
|
+
// 局部优先级高于全局,返回当前请求的task,options。请勿在此处修改options。非必填
|
|
76
|
+
// getTask: (task, options) => {
|
|
77
|
+
// 相当于设置了请求超时时间500ms
|
|
78
|
+
// setTimeout(() => {
|
|
79
|
+
// task.abort()
|
|
80
|
+
// }, 500)
|
|
81
|
+
// },
|
|
82
|
+
// 全局自定义验证器。参数为statusCode 且必存在,不用判断空情况。
|
|
83
|
+
validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置
|
|
84
|
+
return statusCode >= 200 && statusCode < 300
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
可以通过`uni.$uv.http.setConfig()`方法进行全局配置,比如配置请求的全局域名`baseUrl`:
|
|
90
|
+
```js
|
|
91
|
+
uni.$uv.http.setConfig((config) => {
|
|
92
|
+
/* config 为默认全局配置*/
|
|
93
|
+
config.baseURL = `https://www.example.com`; /* 根域名 */
|
|
94
|
+
return config
|
|
95
|
+
})
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
### GET请求
|
|
100
|
+
|
|
101
|
+
需要注意的是,`get`请求与`post`请求略有不同,`get`请求所有参数都在方法的第二个参数中,而`post`请求的第二个参数为请求参数`params`,而第三个参数才为配置项。
|
|
102
|
+
```js
|
|
103
|
+
// 基本用法,注意:get请求的参数以及配置项都在第二个参数中
|
|
104
|
+
uni.$uv.http.get('/user/login', {params: {userName: 'name', password: '123456'}}).then(res => {
|
|
105
|
+
|
|
106
|
+
}).catch(err => {
|
|
107
|
+
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
// 局部修改配置,局部配置优先级高于全局配置
|
|
111
|
+
uni.$uv.http.get('/user/login', {
|
|
112
|
+
params: {userName: 'name', password: '123456'}, /* 会加在url上 */
|
|
113
|
+
header: {}, /* 会与全局header合并,如有同名属性,局部覆盖全局 */
|
|
114
|
+
dataType: 'json',
|
|
115
|
+
// 注:如果局部custom与全局custom有同名属性,则后面的属性会覆盖前面的属性,相当于Object.assign(全局,局部)
|
|
116
|
+
custom: {auth: true}, // 可以加一些自定义参数,在拦截器等地方使用。比如这里我加了一个auth,可在拦截器里拿到,如果true就传token
|
|
117
|
+
// #ifndef MP-ALIPAY
|
|
118
|
+
responseType: 'text',
|
|
119
|
+
// #endif
|
|
120
|
+
// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
|
|
121
|
+
timeout: 60000, // H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
|
|
122
|
+
// #endif
|
|
123
|
+
// #ifdef APP-PLUS
|
|
124
|
+
sslVerify: true, // 验证 ssl 证书 仅5+App安卓端支持(HBuilderX 2.3.3+)
|
|
125
|
+
// #endif
|
|
126
|
+
// #ifdef APP-PLUS
|
|
127
|
+
firstIpv4: false, // DNS解析时优先使用ipv4 仅 App-Android 支持 (HBuilderX 2.8.0+)
|
|
128
|
+
// #endif
|
|
129
|
+
// #ifdef H5
|
|
130
|
+
withCredentials: false, // 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+)
|
|
131
|
+
// #endif
|
|
132
|
+
// 返回当前请求的task, options。请勿在此处修改options。非必填
|
|
133
|
+
getTask: (task, options) => {
|
|
134
|
+
// 相当于设置超时时间500ms
|
|
135
|
+
// setTimeout(() => {
|
|
136
|
+
// task.abort()
|
|
137
|
+
// }, 500)
|
|
138
|
+
},
|
|
139
|
+
//validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置。演示,非必填选项
|
|
140
|
+
// return statusCode >= 200 && statusCode < 300
|
|
141
|
+
//}
|
|
142
|
+
}).then(res => {
|
|
143
|
+
|
|
144
|
+
}).catch(err => {
|
|
145
|
+
|
|
146
|
+
})
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
### POST请求
|
|
151
|
+
|
|
152
|
+
需要注意的是,get请求与post请求略有不同,get请求所有参数都在方法的第二个参数中,而post请求的第二个参数为请求参数params,而第三个参数才为配置项。
|
|
153
|
+
|
|
154
|
+
```js
|
|
155
|
+
// 基本用法,注意:post的第三个参数才为配置项
|
|
156
|
+
uni.$uv.http.post('/user/login', {userName: 'name', password: '123456'} ).then(res => {
|
|
157
|
+
|
|
158
|
+
}).catch(err => {
|
|
159
|
+
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
// 局部修改配置,局部配置优先级高于全局配置
|
|
163
|
+
uni.$uv.http.post('/user/login', {userName: 'name', password: '123456'}, {
|
|
164
|
+
params: {}, /* 会加在url上 */
|
|
165
|
+
header: {}, /* 会与全局header合并,如有同名属性,局部覆盖全局 */
|
|
166
|
+
dataType: 'json',
|
|
167
|
+
// 注:如果局部custom与全局custom有同名属性,则后面的属性会覆盖前面的属性,相当于Object.assign(全局,局部)
|
|
168
|
+
custom: {auth: true}, // 可以加一些自定义参数,在拦截器等地方使用。比如这里我加了一个auth,可在拦截器里拿到,如果true就传token
|
|
169
|
+
// #ifndef MP-ALIPAY
|
|
170
|
+
responseType: 'text',
|
|
171
|
+
// #endif
|
|
172
|
+
// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
|
|
173
|
+
timeout: 60000, // H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序
|
|
174
|
+
// #endif
|
|
175
|
+
// #ifdef APP-PLUS
|
|
176
|
+
sslVerify: true, // 验证 ssl 证书 仅5+App安卓端支持(HBuilderX 2.3.3+)
|
|
177
|
+
// #endif
|
|
178
|
+
// #ifdef APP-PLUS
|
|
179
|
+
firstIpv4: false, // DNS解析时优先使用ipv4 仅 App-Android 支持 (HBuilderX 2.8.0+)
|
|
180
|
+
// #endif
|
|
181
|
+
// #ifdef H5
|
|
182
|
+
withCredentials: false, // 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+)
|
|
183
|
+
// #endif
|
|
184
|
+
// 返回当前请求的task, options。请勿在此处修改options。非必填
|
|
185
|
+
getTask: (task, options) => {
|
|
186
|
+
// 相当于设置超时时间500ms
|
|
187
|
+
// setTimeout(() => {
|
|
188
|
+
// task.abort()
|
|
189
|
+
// }, 500)
|
|
190
|
+
},
|
|
191
|
+
//validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置。演示,非必填选项
|
|
192
|
+
// return statusCode >= 200 && statusCode < 300
|
|
193
|
+
//}
|
|
194
|
+
}).then(res => {
|
|
195
|
+
|
|
196
|
+
}).catch(err => {
|
|
197
|
+
|
|
198
|
+
})
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
### UPLOAD请求
|
|
203
|
+
|
|
204
|
+
具体参数说明:[uni.uploadFile](https://uniapp.dcloud.io/api/request/network-file)
|
|
205
|
+
|
|
206
|
+
```js
|
|
207
|
+
uni.$uv.http.upload('api/upload/img', {
|
|
208
|
+
params: {}, /* 会加在url上 */
|
|
209
|
+
// #ifdef APP-PLUS || H5
|
|
210
|
+
files: [], // 需要上传的文件列表。使用 files 时,filePath 和 name 不生效。App、H5( 2.6.15+)
|
|
211
|
+
// #endif
|
|
212
|
+
// #ifdef MP-ALIPAY
|
|
213
|
+
fileType: 'image/video/audio', // 仅支付宝小程序,且必填。
|
|
214
|
+
// #endif
|
|
215
|
+
filePath: '', // 要上传文件资源的路径。
|
|
216
|
+
// 注:如果局部custom与全局custom有同名属性,则后面的属性会覆盖前面的属性,相当于Object.assign(全局,局部)
|
|
217
|
+
custom: {auth: true}, // 可以加一些自定义参数,在拦截器等地方使用。比如这里我加了一个auth,可在拦截器里拿到,如果true就传token
|
|
218
|
+
name: 'file', // 文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容
|
|
219
|
+
// #ifdef H5 || APP-PLUS
|
|
220
|
+
timeout: 60000, // H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)
|
|
221
|
+
// #endif
|
|
222
|
+
header: {}, /* 会与全局header合并,如有同名属性,局部覆盖全局 */
|
|
223
|
+
formData: {}, // HTTP 请求中其他额外的 form data
|
|
224
|
+
// 返回当前请求的task, options。请勿在此处修改options。非必填
|
|
225
|
+
getTask: (task, options) => {
|
|
226
|
+
// task.onProgressUpdate((res) => {
|
|
227
|
+
// console.log('上传进度' + res.progress);
|
|
228
|
+
// console.log('已经上传的数据长度' + res.totalBytesSent);
|
|
229
|
+
// console.log('预期需要上传的数据总长度' + res.totalBytesExpectedToSend);
|
|
230
|
+
//
|
|
231
|
+
// // 测试条件,取消上传任务。
|
|
232
|
+
// if (res.progress > 50) {
|
|
233
|
+
// uploadTask.abort();
|
|
234
|
+
// }
|
|
235
|
+
// });
|
|
236
|
+
},
|
|
237
|
+
//validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置。演示,非必填选项
|
|
238
|
+
// return statusCode >= 200 && statusCode < 300
|
|
239
|
+
//}
|
|
240
|
+
}).then(res => {
|
|
241
|
+
// 返回的res.data 已经进行JSON.parse
|
|
242
|
+
}).catch(err => {
|
|
243
|
+
|
|
244
|
+
})
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
### DOWNLOAD请求
|
|
249
|
+
|
|
250
|
+
具体参数说明:[uni.downloadFile](https://uniapp.dcloud.io/api/request/network-file?id=downloadfile)
|
|
251
|
+
|
|
252
|
+
```js
|
|
253
|
+
uni.$uv.http.download('api/download', {
|
|
254
|
+
params: {}, /* 会加在url上 */
|
|
255
|
+
// #ifdef H5 || APP-PLUS
|
|
256
|
+
timeout: 3000, // H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)
|
|
257
|
+
// #endif
|
|
258
|
+
header: {}, /* 会与全局header合并,如有同名属性,局部覆盖全局 */
|
|
259
|
+
custom: {}, // 自定义参数
|
|
260
|
+
// 返回当前请求的task, options。非必填
|
|
261
|
+
getTask: (task, options) => {
|
|
262
|
+
// setTimeout(() => {
|
|
263
|
+
// task.abort()
|
|
264
|
+
// }, 500)
|
|
265
|
+
},
|
|
266
|
+
//validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置。演示,非必填选项
|
|
267
|
+
// return statusCode >= 200 && statusCode < 300
|
|
268
|
+
//}
|
|
269
|
+
}).then(res => {
|
|
270
|
+
|
|
271
|
+
}).catch(err => {
|
|
272
|
+
|
|
273
|
+
})
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
### 请求拦截器
|
|
278
|
+
|
|
279
|
+
```js
|
|
280
|
+
uni.$uv.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
|
|
281
|
+
config.header = {
|
|
282
|
+
...config.header,
|
|
283
|
+
a: 1 // 演示拦截器header加参
|
|
284
|
+
}
|
|
285
|
+
// 演示custom 用处
|
|
286
|
+
// if (config.custom.auth) {
|
|
287
|
+
// config.header.token = 'token'
|
|
288
|
+
// }
|
|
289
|
+
// if (config.custom.loading) {
|
|
290
|
+
// uni.showLoading()
|
|
291
|
+
// }
|
|
292
|
+
// 演示
|
|
293
|
+
// if (!token) { // 如果token不存在,return Promise.reject(config) 会取消本次请求
|
|
294
|
+
// return Promise.reject(config)
|
|
295
|
+
// }
|
|
296
|
+
return config
|
|
297
|
+
}, config => { // 可使用async await 做异步操作
|
|
298
|
+
return Promise.reject(config)
|
|
299
|
+
})
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### 响应拦截器
|
|
303
|
+
|
|
304
|
+
```js
|
|
305
|
+
uni.$uv.http.interceptors.response.use((response) => {
|
|
306
|
+
/* 对响应成功做点什么 可使用async await 做异步操作*/
|
|
307
|
+
// if (response.data.code !== 200) { // 服务端返回的状态码不等于200,则reject()
|
|
308
|
+
// return Promise.reject(response) // return Promise.reject 可使promise状态进入catch
|
|
309
|
+
// if (response.config.custom.verification) { // 演示自定义参数的作用
|
|
310
|
+
// return response.data
|
|
311
|
+
// }
|
|
312
|
+
console.log(response)
|
|
313
|
+
return response
|
|
314
|
+
}, (response) => {
|
|
315
|
+
/* 对响应错误做点什么 (statusCode !== 200)*/
|
|
316
|
+
console.log(response)
|
|
317
|
+
return Promise.reject(response)
|
|
318
|
+
})
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
### 实践
|
|
323
|
+
|
|
324
|
+
:::tip 提示
|
|
325
|
+
uv-ui的请求相关完整示例,可以下载示例项目查看,请求和响应拦截器在`util/request`目录下,是单独的js文件`requestInterceptors.js`和`responseInterceptors.js`,请求和响应后的扩展逻辑可以在相应文件里面添加。
|
|
326
|
+
:::
|
|
327
|
+
|
|
328
|
+
假设我们项目中需要用到请求和响应拦截器,并且在请求拦截器中需要调用`vuex`中的变量,可按如下步骤进行操作(仅供参考):
|
|
329
|
+
|
|
330
|
+
#### 1. 全局配置,以及请求,响应拦截器定义
|
|
331
|
+
|
|
332
|
+
在`/utils/request/index.js`中,写入如下内容:
|
|
333
|
+
```js
|
|
334
|
+
import store from '@/store';
|
|
335
|
+
|
|
336
|
+
export const Request = () => {
|
|
337
|
+
// 初始化请求配置
|
|
338
|
+
uni.$uv.http.setConfig((config) => {
|
|
339
|
+
/* config 为默认全局配置*/
|
|
340
|
+
config.baseURL = 'https://www.example.com'; /* 根域名 */
|
|
341
|
+
return config
|
|
342
|
+
})
|
|
343
|
+
|
|
344
|
+
// 请求拦截
|
|
345
|
+
uni.$uv.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
|
|
346
|
+
// 初始化请求拦截器时,会执行此方法,此时data为undefined,赋予默认{}
|
|
347
|
+
config.data = config.data || {}
|
|
348
|
+
// 根据custom参数中配置的是否需要token,添加对应的请求头
|
|
349
|
+
if(config?.custom?.auth) {
|
|
350
|
+
config.header.token = store.state.userInfo.token
|
|
351
|
+
}
|
|
352
|
+
return config
|
|
353
|
+
}, config => { // 可使用async await 做异步操作
|
|
354
|
+
return Promise.reject(config)
|
|
355
|
+
})
|
|
356
|
+
|
|
357
|
+
// 响应拦截
|
|
358
|
+
uni.$uv.http.interceptors.response.use((response) => { /* 对响应成功做点什么 可使用async await 做异步操作*/
|
|
359
|
+
const data = response.data
|
|
360
|
+
|
|
361
|
+
// 自定义参数
|
|
362
|
+
const custom = response.config?.custom
|
|
363
|
+
if (data.code !== 200) {
|
|
364
|
+
// 如果没有显式定义custom的toast参数为false的话,默认对报错进行toast弹出提示
|
|
365
|
+
if (custom.toast !== false) {
|
|
366
|
+
uni.$uv.toast(data.message)
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// 如果需要catch返回,则进行reject
|
|
370
|
+
if (custom?.catch) {
|
|
371
|
+
return Promise.reject(data)
|
|
372
|
+
} else {
|
|
373
|
+
// 否则返回一个pending中的promise,请求不会进入catch中
|
|
374
|
+
return new Promise(() => { })
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return data.data === undefined ? {} : data.data
|
|
378
|
+
}, (response) => {
|
|
379
|
+
// 对响应错误做点什么 (statusCode !== 200)
|
|
380
|
+
return Promise.reject(response)
|
|
381
|
+
})
|
|
382
|
+
}
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
|
|
386
|
+
#### 2. 引用配置
|
|
387
|
+
|
|
388
|
+
我们可以在 `main.js` 中引用 `/utils/request/index.js`。Vue 3 项目中,在 `createSSRApp(App)` 并注册 `uvUI` 后初始化请求封装:
|
|
389
|
+
|
|
390
|
+
```js
|
|
391
|
+
import App from './App'
|
|
392
|
+
import { createSSRApp } from 'vue'
|
|
393
|
+
import uvUI from '@gmcb/uv-ui'
|
|
394
|
+
import { Request } from '@/utils/request/index'
|
|
395
|
+
|
|
396
|
+
export function createApp() {
|
|
397
|
+
const app = createSSRApp(App)
|
|
398
|
+
app.use(uvUI)
|
|
399
|
+
Request(app)
|
|
400
|
+
return {
|
|
401
|
+
app
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
#### 3. Api集中管理
|
|
407
|
+
|
|
408
|
+
在`/common/api.js`中编写请求接口:
|
|
409
|
+
|
|
410
|
+
```js
|
|
411
|
+
// post请求,获取菜单
|
|
412
|
+
export const postMenu = (params, config = {}) => uni.$uv.http.post('/ebapi/public_api/index', params, config)
|
|
413
|
+
|
|
414
|
+
// get请求,获取菜单,注意:get请求的配置等,都在第二个参数中,详见前面解释
|
|
415
|
+
export const getMenu = (data) => uni.$uv.http.get('/ebapi/public_api/index', data)
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
#### 4. 发送请求
|
|
419
|
+
|
|
420
|
+
```js
|
|
421
|
+
import { postMenu, getMenu } from '/config/api.js';
|
|
422
|
+
|
|
423
|
+
// 发出post,假设需要带上token
|
|
424
|
+
postMenu({ custom: { auth: true }}).then(() => {
|
|
425
|
+
|
|
426
|
+
}).catch(() =>{
|
|
427
|
+
|
|
428
|
+
})
|
|
429
|
+
|
|
430
|
+
// await等待,注意与async结合使用
|
|
431
|
+
await postMenu({ custom: { auth: true }})
|
|
432
|
+
|
|
433
|
+
// 假设不需要在响应拦截器中自动弹出的toast,以及不想写catch(如果promise中进行reject,但是却没有catch的话会报错)
|
|
434
|
+
postMenu({ custom: { auth: true, toast: false, catch: false }}).then(() => {
|
|
435
|
+
|
|
436
|
+
})
|
|
437
|
+
|
|
438
|
+
// get请求
|
|
439
|
+
getMenu({ custom: { auth: true }}).then(() => {
|
|
440
|
+
|
|
441
|
+
}).catch(() =>{
|
|
442
|
+
|
|
443
|
+
})
|
|
444
|
+
|
|
445
|
+
// 也可以直接通过uni.$uv.post发出请求,注意此处需要写上接口地址
|
|
446
|
+
uni.$uv.http.post('/common/menu', { custom: { auth: true }}).then(() => {
|
|
447
|
+
|
|
448
|
+
}).catch(() =>{
|
|
449
|
+
|
|
450
|
+
})
|
|
451
|
+
```
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
## 颜色转换
|
|
2
|
+
|
|
3
|
+
### 按需引入
|
|
4
|
+
|
|
5
|
+
如果未做全局[扩展配置](https://www.uvui.cn/components/setting.html),可以按需引入:
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
// 引入
|
|
9
|
+
import { rgbToHex, hexToRgb, colorGradient } from '@gmcb/uv-ui/libs/function/colorGradient.js';
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
### rgbToHex(rgb)
|
|
13
|
+
|
|
14
|
+
RGB转十六进制Hex,该函数可以将一个RGB颜色值转换成一个Hex的十六进制颜色值
|
|
15
|
+
|
|
16
|
+
- `rgb` <String\> RGB颜色值,如`rgb(230, 231, 233)`
|
|
17
|
+
|
|
18
|
+
```vue
|
|
19
|
+
<script setup>
|
|
20
|
+
import { onLoad } from '@dcloudio/uni-app';
|
|
21
|
+
|
|
22
|
+
onLoad(() => {
|
|
23
|
+
console.log(uni.$uv.rgbToHex('rgb(13, 145, 20)'));
|
|
24
|
+
});
|
|
25
|
+
</script>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### hexToRgb(hex)
|
|
29
|
+
|
|
30
|
+
十六进制Hex转RGB,该函数可以将一个Hex的十六进制颜色值转换成一个RGB颜色值
|
|
31
|
+
|
|
32
|
+
- `hex` <String\> HEx颜色值,如`#0afdce`
|
|
33
|
+
|
|
34
|
+
```vue
|
|
35
|
+
<script setup>
|
|
36
|
+
import { onLoad } from '@dcloudio/uni-app';
|
|
37
|
+
|
|
38
|
+
onLoad(() => {
|
|
39
|
+
console.log(uni.$uv.hexToRgb('#0afdce'));
|
|
40
|
+
});
|
|
41
|
+
</script>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### colorGradient(startColor, endColor, step)
|
|
45
|
+
|
|
46
|
+
颜色渐变。该函数实现两个颜色值之间等分取值,返回一个数组,元素为十六进制形式的颜色值,数组长度为`step`值。
|
|
47
|
+
例如:colorGradient('rgb(250, 250, 250)', 'rgb(252, 252, 252)', 3),得到的结果为["#fafafa", "#fafafa", "#fbfbfb"]
|
|
48
|
+
|
|
49
|
+
- `startColor` <String\> 开始颜色值,可以是HEX或者RGB颜色值,如`#0afdce`或者`rgb(120, 130, 150)`
|
|
50
|
+
- `endColor` <String\> 结束颜色值,可以是HEX或者RGB颜色值,如`#0afdce`或者`rgb(120, 130, 150)`
|
|
51
|
+
- `step` <Number\> 均分值,把开始值和结束值平均分成多少份
|
|
52
|
+
|
|
53
|
+
```vue
|
|
54
|
+
<script setup>
|
|
55
|
+
import { onLoad } from '@dcloudio/uni-app';
|
|
56
|
+
|
|
57
|
+
onLoad(() => {
|
|
58
|
+
console.log(uni.$uv.colorGradient('rgb(250,250,250)', 'rgb(252,252,252)', 3));
|
|
59
|
+
// 结果为:["#fafafa", "#fafafa", "#fbfbfb"]
|
|
60
|
+
});
|
|
61
|
+
</script>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### colorToRgba(color, opacity = 0.3)
|
|
65
|
+
|
|
66
|
+
颜色透明度。该函数可以接受一个`十六进制`或者`rgb`格式的颜色值(不能接受命名式颜色格式,比如`white`),返回此颜色的`rgba`格式值,如下:
|
|
67
|
+
|
|
68
|
+
- `color` <String\> 颜色值,只能`hex`或者`rgba`格式
|
|
69
|
+
- `opacity` <Number\> 不透明度值,取值为0-1之间
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
uni.$uv.colorToRgba('#000000', 0.35);
|
|
74
|
+
// 结果为 rgba(0, 0, 0, 0.35)
|
|
75
|
+
|
|
76
|
+
uni.$uv.colorToRgba('rgb(255, 180, 0)', 0.4);
|
|
77
|
+
// 结果为 rgba(255, 180, 0, 0.4)
|
|
78
|
+
```
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
## throttle & debounce节流防抖
|
|
2
|
+
|
|
3
|
+
### 按需引入
|
|
4
|
+
|
|
5
|
+
如果未做全局[扩展配置](https://www.uvui.cn/components/setting.html),可以按需引入:
|
|
6
|
+
|
|
7
|
+
#### 节流
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
// 引入
|
|
11
|
+
import throttle from '@gmcb/uv-ui/libs/function/throttle.js';
|
|
12
|
+
// 调用
|
|
13
|
+
throttle(()=>{
|
|
14
|
+
console.log('执行')
|
|
15
|
+
})
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
#### 防抖
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
// 引入
|
|
22
|
+
import debounce from '@gmcb/uv-ui/libs/function/debounce.js';
|
|
23
|
+
// 调用
|
|
24
|
+
debounce(()=>{
|
|
25
|
+
console.log('执行')
|
|
26
|
+
})
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 何谓节流和防抖?
|
|
30
|
+
|
|
31
|
+
- 节流
|
|
32
|
+
节流的意思是,规定时间内,只触发一次。比如我们设定500ms,在这个时间内,无论点击按钮多少次,它都只会触发一次。具体场景可以是抢购时候,由于有无数人
|
|
33
|
+
快速点击按钮,如果每次点击都发送请求,就会给服务器造成巨大的压力,但是我们进行节流后,就会大大减少请求的次数。
|
|
34
|
+
|
|
35
|
+
- 防抖
|
|
36
|
+
防抖的意思是,在连续的操作中,无论进行了多长时间,只有某一次的操作后在指定的时间内没有再操作,这一次才被判定有效。具体场景可以搜索框输入关键字过程中实时
|
|
37
|
+
请求服务器匹配搜索结果,如果不进行处理,那么就是输入框内容一直变化,导致一直发送请求。如果进行防抖处理,结果就是当我们输入内容完成后,一定时间(比如500ms)没有再
|
|
38
|
+
输入内容,这时再触发请求。
|
|
39
|
+
|
|
40
|
+
结合以上两种情况,回到我们最实际的场景,比如防止表单提交按钮被多次触发,我们应该选择使用`节流`而不是`防抖`方案。
|
|
41
|
+
|
|
42
|
+
:::tip 温馨提示
|
|
43
|
+
uv-ui内置的按钮组件`uv-button`内部已做节流处理,无需外部再做节流处理。配置`throttle-time`参数,可以设置节流的时间,详见[Button 按钮](/components/button.html)
|
|
44
|
+
:::
|
|
45
|
+
|
|
46
|
+
### 节流
|
|
47
|
+
|
|
48
|
+
#### throttle(func, wait = 500, immediate = true)
|
|
49
|
+
|
|
50
|
+
规定时间内,只触发一次,可以通过设置`immediate`来决定触发的时机在这个时间的开始,还是结束的时候执行。
|
|
51
|
+
|
|
52
|
+
- `func` <Function\> 触发回调执行的函数
|
|
53
|
+
- `wait` <Number\> 时间间隔,单位ms
|
|
54
|
+
- `immediate` <Boolean\> 在开始还是结束处触发,比如设置`wait`为1000ms,如果在一秒内进行了5次操作,只触发一次,如果`immediate`为`true`,那么就会在第一次操作
|
|
55
|
+
触发回调,如果为`false`,就会在第5次操作触发回调。
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
```vue
|
|
59
|
+
<template>
|
|
60
|
+
<view>
|
|
61
|
+
<button @click="btnClick">对酒当歌</button>
|
|
62
|
+
</view>
|
|
63
|
+
</template>
|
|
64
|
+
<script setup>
|
|
65
|
+
function btnClick() {
|
|
66
|
+
uni.$uv.throttle(toNext, 500);
|
|
67
|
+
}
|
|
68
|
+
function toNext() {
|
|
69
|
+
console.log('btnBClick');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
</script>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
### 防抖
|
|
78
|
+
|
|
79
|
+
#### debounce(func, wait = 500, immediate = false)
|
|
80
|
+
|
|
81
|
+
在连续的操作中,无论进行了多长时间,只有某一次的操作后在指定的时间内没有再操作,这一次才被判定有效
|
|
82
|
+
|
|
83
|
+
- `func` <Function\> 触发回调执行的函数
|
|
84
|
+
- `wait` <Number\> 时间间隔,单位ms
|
|
85
|
+
- `immediate` <Number\> 在开始还是结束处触发,如非特殊情况,一般默认为`false`即可
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
```vue
|
|
89
|
+
<template>
|
|
90
|
+
<view>
|
|
91
|
+
<button @click="btnClick">对酒当歌</button>
|
|
92
|
+
</view>
|
|
93
|
+
</template>
|
|
94
|
+
<script setup>
|
|
95
|
+
function btnClick() {
|
|
96
|
+
uni.$uv.debounce(toNext, 500);
|
|
97
|
+
}
|
|
98
|
+
function toNext() {
|
|
99
|
+
console.log('btnBClick');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
</script>
|
|
103
|
+
|
|
104
|
+
```
|