uview-pro 0.0.3 → 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.
Files changed (76) hide show
  1. package/changelog.md +156 -1
  2. package/components/u-action-sheet/u-action-sheet.vue +4 -4
  3. package/components/u-avatar/u-avatar.vue +1 -1
  4. package/components/u-badge/u-badge.vue +1 -1
  5. package/components/u-button/u-button.vue +102 -25
  6. package/components/u-card/u-card.vue +1 -1
  7. package/components/u-cell-group/u-cell-group.vue +1 -1
  8. package/components/u-cell-item/u-cell-item.vue +1 -1
  9. package/components/u-checkbox/u-checkbox.vue +1 -1
  10. package/components/u-checkbox-group/u-checkbox-group.vue +1 -1
  11. package/components/u-circle-progress/u-circle-progress.vue +1 -1
  12. package/components/u-city-select/u-city-select.vue +244 -0
  13. package/components/u-col/u-col.vue +1 -1
  14. package/components/u-collapse/u-collapse.vue +1 -1
  15. package/components/u-collapse-item/u-collapse-item.vue +2 -2
  16. package/components/u-count-down/u-count-down.vue +1 -1
  17. package/components/u-count-to/u-count-to.vue +1 -1
  18. package/components/u-divider/u-divider.vue +1 -1
  19. package/components/u-empty/u-empty.vue +1 -1
  20. package/components/u-field/u-field.vue +1 -1
  21. package/components/u-gap/u-gap.vue +1 -1
  22. package/components/u-grid/u-grid.vue +1 -1
  23. package/components/u-grid-item/u-grid-item.vue +1 -1
  24. package/components/u-icon/u-icon.vue +29 -23
  25. package/components/u-index-anchor/u-index-anchor.vue +1 -1
  26. package/components/u-index-list/u-index-list.vue +1 -1
  27. package/components/u-keyboard/u-keyboard.vue +1 -1
  28. package/components/u-lazy-load/u-lazy-load.vue +1 -1
  29. package/components/u-line/u-line.vue +1 -1
  30. package/components/u-line-progress/u-line-progress.vue +1 -1
  31. package/components/u-link/u-link.vue +1 -1
  32. package/components/u-loading/u-loading.vue +1 -1
  33. package/components/u-loadmore/u-loadmore.vue +1 -1
  34. package/components/u-mask/u-mask.vue +1 -1
  35. package/components/u-message-input/u-message-input.vue +1 -1
  36. package/components/u-modal/u-modal.vue +1 -1
  37. package/components/u-navbar/u-navbar.vue +1 -1
  38. package/components/u-no-network/u-no-network.vue +1 -1
  39. package/components/u-notice-bar/u-notice-bar.vue +1 -1
  40. package/components/u-number-box/u-number-box.vue +1 -1
  41. package/components/u-picker/u-picker.vue +1 -1
  42. package/components/u-popup/u-popup.vue +1 -1
  43. package/components/u-radio/u-radio.vue +1 -1
  44. package/components/u-radio-group/u-radio-group.vue +1 -1
  45. package/components/u-rate/u-rate.vue +1 -1
  46. package/components/u-read-more/u-read-more.vue +1 -1
  47. package/components/u-row/u-row.vue +1 -1
  48. package/components/u-search/u-search.vue +1 -1
  49. package/components/u-section/u-section.vue +1 -1
  50. package/components/u-skeleton/u-skeleton.vue +1 -1
  51. package/components/u-steps/u-steps.vue +1 -1
  52. package/components/u-sticky/u-sticky.vue +1 -1
  53. package/components/u-subsection/u-subsection.vue +1 -1
  54. package/components/u-swipe-action/u-swipe-action.vue +1 -1
  55. package/components/u-swiper/u-swiper.vue +1 -1
  56. package/components/u-switch/u-switch.vue +1 -1
  57. package/components/u-table/u-table.vue +1 -1
  58. package/components/u-tabs/u-tabs.vue +1 -1
  59. package/components/u-tabs-swiper/u-tabs-swiper.vue +1 -1
  60. package/components/u-tag/u-tag.vue +1 -1
  61. package/components/u-td/u-td.vue +1 -1
  62. package/components/u-th/u-th.vue +1 -1
  63. package/components/u-time-line/u-time-line.vue +1 -1
  64. package/components/u-time-line-item/u-time-line-item.vue +1 -1
  65. package/components/u-toast/u-toast.vue +1 -1
  66. package/components/u-top-tips/u-top-tips.vue +1 -1
  67. package/components/u-tr/u-tr.vue +1 -1
  68. package/components/u-upload/u-upload.vue +12 -6
  69. package/components/u-verification-code/u-verification-code.vue +1 -1
  70. package/components/u-waterfall/u-waterfall.vue +1 -1
  71. package/libs/function/md5.ts +3 -1
  72. package/libs/request/auto-http.ts +76 -0
  73. package/libs/request/uni-http.md +156 -0
  74. package/libs/request/uni-http.ts +434 -0
  75. package/package.json +5 -3
  76. package/readme.md +33 -15
@@ -0,0 +1,434 @@
1
+ /**
2
+ * 通用 uni-app 网络请求,uni.request
3
+ * 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截
4
+ * @author anyup
5
+ */
6
+ import deepMerge from '../function/deepMerge';
7
+
8
+ // 请求内容类型枚举
9
+ export enum ContentType {
10
+ JSON = 'application/json;charset=UTF-8',
11
+ URLENCODED = 'application/x-www-form-urlencoded',
12
+ FORMDATA = 'multipart/form-data'
13
+ }
14
+
15
+ // 请求方法类型
16
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'HEAD' | 'DELETE' | 'UPLOAD';
17
+
18
+ // 请求头类型
19
+ export type HttpHeaderType = Record<string, string>;
20
+
21
+ // 请求配置类型
22
+ export interface HttpRequestConfig {
23
+ baseURL?: string;
24
+ url?: string | Function;
25
+ header?: HttpHeaderType;
26
+ data?: unknown;
27
+ method?: HttpMethod;
28
+ dataType?: string;
29
+ responseType?: string;
30
+ success?: (res: unknown) => void;
31
+ fail?: (err: unknown) => void;
32
+ complete?: (res: unknown) => void;
33
+ [key: string]: unknown;
34
+ }
35
+
36
+ // 拦截器类型
37
+ export interface Interceptor<T = unknown> {
38
+ handler?: (arg: T, P: typeof Promise) => unknown;
39
+ onerror?: (arg: T, P: typeof Promise) => unknown;
40
+ complete?: (arg: T, P: typeof Promise) => unknown;
41
+ use: (...args: any[]) => void;
42
+ lock?: () => void;
43
+ unlock?: () => void;
44
+ clear?: () => void;
45
+ p?: Promise<unknown> | null;
46
+ }
47
+
48
+ /**
49
+ * HttpHeader 构造器,自动处理 Content-Type
50
+ */
51
+ export class HttpHeader {
52
+ [key: string]: string;
53
+ constructor(params: HttpHeaderType) {
54
+ Object.keys(params).forEach(key => {
55
+ if (key === 'Content-Type') {
56
+ this[key] = ContentType[params[key] as keyof typeof ContentType] || params[key];
57
+ } else {
58
+ this[key] = params[key];
59
+ }
60
+ });
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Builder 用于批量生成 API 方法
66
+ */
67
+ export class Builder {
68
+ private http: Http;
69
+ constructor(http: Http) {
70
+ this.http = http;
71
+ }
72
+ /**
73
+ * 根据 url 配置表批量生成 API 方法
74
+ */
75
+ dispatch(urls: Record<string, any>) {
76
+ const obj: Record<string, any> = {};
77
+ Object.keys(urls).forEach(name => {
78
+ obj[name] = this.use.bind(this, urls[name]);
79
+ });
80
+ return obj;
81
+ }
82
+ /**
83
+ * 发送请求
84
+ */
85
+ use<T = unknown>(urlConfig: Record<string, any>, data?: unknown, config: HttpRequestConfig = {}): Promise<T> {
86
+ // 请求地址
87
+ let url = config?.url ?? urlConfig.url;
88
+ // 兼容 restful url,如果是使用url为function,则为restful格式
89
+ if (config.url && typeof config.url === 'function') {
90
+ url = `${urlConfig.url}${config.url()}`;
91
+ }
92
+ // 请求类型,get,post,put,delete
93
+ const method = config?.method ?? urlConfig?.method ?? 'GET';
94
+ const options = { ...deepMerge(urlConfig, config), url, method };
95
+ return this.http.request<T>(options);
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Http 主类,支持拦截器、链式配置、类型完善
101
+ */
102
+ export class Http {
103
+ static Builder = Builder;
104
+ config: HttpRequestConfig;
105
+ interceptors: {
106
+ response: Interceptor;
107
+ request: Interceptor;
108
+ };
109
+
110
+ constructor(options: HttpRequestConfig = {}) {
111
+ this.config = {
112
+ baseURL: '',
113
+ header: new HttpHeader({ 'Content-Type': 'JSON' }),
114
+ data: {},
115
+ method: 'GET',
116
+ dataType: 'json',
117
+ responseType: 'text',
118
+ success() {},
119
+ fail() {},
120
+ complete() {},
121
+ ...options
122
+ };
123
+ this.interceptors = {
124
+ response: {
125
+ use(handler, onerror, complete) {
126
+ this.handler = handler;
127
+ this.onerror = onerror;
128
+ this.complete = complete;
129
+ }
130
+ },
131
+ request: {
132
+ use(handler) {
133
+ this.handler = handler;
134
+ }
135
+ }
136
+ };
137
+ wrap(this.interceptors.request);
138
+ wrap(this.interceptors.response);
139
+ }
140
+
141
+ /**
142
+ * 设置 baseURL
143
+ */
144
+ setBaseURL(baseURL: string) {
145
+ this.config.baseURL = baseURL;
146
+ return this;
147
+ }
148
+
149
+ /**
150
+ * 设置 header
151
+ */
152
+ setHeader(header: HttpHeaderType) {
153
+ this.config.header = { ...this.config.header, ...header };
154
+ return this;
155
+ }
156
+
157
+ /**
158
+ * 设置 data
159
+ */
160
+ setData(data: unknown) {
161
+ if (isArray(data)) {
162
+ this.config.data = data;
163
+ } else if (isObject(data) && isObject(this.config.data)) {
164
+ this.config.data = { ...(this.config.data as object), ...(data as object) };
165
+ } else {
166
+ this.config.data = data;
167
+ }
168
+ return this;
169
+ }
170
+
171
+ /**
172
+ * 设置其他 options
173
+ */
174
+ setOptions(options: HttpRequestConfig) {
175
+ this.config = { ...this.config, ...options };
176
+ }
177
+
178
+ /**
179
+ * 请求主方法
180
+ * @param options 实时传递的配置
181
+ * @returns Promise
182
+ * 说明:配置优先级 实时传递的 options > 公共配置的 config
183
+ */
184
+ request<T = unknown>(options: HttpRequestConfig = {}): Promise<T> {
185
+ if (!options) options = {};
186
+ // 请求体
187
+ const data = options.data || {};
188
+ // 请求baseURL:优先级为:实时传递的 > 公共配置的
189
+ options.baseURL = options.baseURL !== undefined ? options.baseURL : this.config.baseURL;
190
+ // 请求头:合并公共配置与实时设置的header, 且优先级实时设置会覆盖公共配置的
191
+ options.header = { ...this.config.header, ...options.header };
192
+ // 请求方式:优先级为:实时传递的 > 公共配置的
193
+ options.method = options.method || this.config.method;
194
+ // 数据格式:默认json
195
+ options.dataType = options.dataType || this.config.dataType;
196
+ // 请求体:优先级为:实时传递的 > 公共配置的
197
+ if (isArray(data)) {
198
+ options.data = data;
199
+ } else if (isObject(data) && isObject(this.config.data)) {
200
+ options.data = { ...(this.config.data as object), ...(data as object) };
201
+ } else {
202
+ options.data = data;
203
+ }
204
+
205
+ // 拦截器处理
206
+ const interceptors = this.interceptors;
207
+ const requestInterceptor = interceptors.request;
208
+ const responseInterceptor = interceptors.response;
209
+ const requestInterceptorHandler = requestInterceptor.handler;
210
+
211
+ return new Promise((resolve: (value: T) => void, reject: (reason?: unknown) => void) => {
212
+ function isPromise(p: unknown): p is Promise<unknown> {
213
+ return !!p && typeof (p as any).then === 'function' && typeof (p as any).catch === 'function';
214
+ }
215
+ function enqueueIfLocked(promise: Promise<unknown> | null | undefined, callback: () => void) {
216
+ if (promise) {
217
+ promise.then(() => {
218
+ callback();
219
+ });
220
+ } else {
221
+ callback();
222
+ }
223
+ }
224
+ function onresult(handler: ((arg: unknown, P: typeof Promise) => unknown) | undefined, response: unknown, type: number) {
225
+ enqueueIfLocked(responseInterceptor.p, function () {
226
+ if (handler) {
227
+ (response as any).request = options;
228
+ const ret = handler.call(responseInterceptor, response, Promise);
229
+ response = ret === undefined ? response : ret;
230
+ }
231
+ if (!isPromise(response)) {
232
+ response = Promise[type === 0 ? 'resolve' : 'reject'](response);
233
+ }
234
+ (response as Promise<unknown>)
235
+ .then((d: unknown) => {
236
+ resolve((d as any).data as T);
237
+ })
238
+ .catch((e: unknown) => {
239
+ reject(e);
240
+ });
241
+ });
242
+ }
243
+ (options as any).complete = (response: unknown) => {
244
+ const statusCode: number = (response as any).statusCode;
245
+ let type = 0;
246
+ if ((statusCode >= 200 && statusCode < 300) || statusCode === 304) {
247
+ type = 0;
248
+ onresult(responseInterceptor.handler, response, type);
249
+ } else {
250
+ type = -1;
251
+ onresult(responseInterceptor.onerror, response, type);
252
+ }
253
+ onresult(responseInterceptor.complete, response, type);
254
+ };
255
+ enqueueIfLocked(requestInterceptor.p, () => {
256
+ options = Object.assign({}, this.config, options);
257
+ (options as any).requestId = new Date().getTime();
258
+ let ret: unknown = options;
259
+ if (requestInterceptorHandler) {
260
+ ret = requestInterceptorHandler.call(requestInterceptor, options, Promise) || options;
261
+ }
262
+ if (!isPromise(ret)) {
263
+ ret = Promise.resolve(ret);
264
+ }
265
+ (ret as Promise<unknown>).then(
266
+ (d: unknown) => {
267
+ if (d === options) {
268
+ // 这里断言为 any,兼容 baseURL、restURL、url、method 等属性
269
+ const req = d as any;
270
+ req.url = req.url && req.url.indexOf('http') !== 0 ? req.baseURL + req.url : req.url;
271
+ req.url = req.restURL ? req.url + req.restURL : req.url;
272
+ req.method = req.method.toUpperCase();
273
+ if (req.method === 'UPLOAD') {
274
+ uni.uploadFile(req);
275
+ } else {
276
+ uni.request(req);
277
+ }
278
+ } else {
279
+ resolve(d as T);
280
+ }
281
+ },
282
+ (err: unknown) => {
283
+ reject(err);
284
+ }
285
+ );
286
+ });
287
+ });
288
+ }
289
+
290
+ /**
291
+ * 并发请求
292
+ */
293
+ all<T = unknown>(promises: Promise<T>[]): Promise<T[]> {
294
+ return Promise.all(promises);
295
+ }
296
+
297
+ /**
298
+ * GET 请求
299
+ */
300
+ get<T = unknown>(url: string, data?: unknown, option?: HttpRequestConfig): Promise<T> {
301
+ return this.request<T>(merge({ url, data, method: 'GET' }, option));
302
+ }
303
+ /**
304
+ * POST 请求
305
+ */
306
+ post<T = unknown>(url: string, data?: unknown, option?: HttpRequestConfig): Promise<T> {
307
+ return this.request<T>(merge({ url, data, method: 'POST' }, option));
308
+ }
309
+ /**
310
+ * PUT 请求
311
+ */
312
+ put<T = unknown>(url: string, data?: unknown, option?: HttpRequestConfig): Promise<T> {
313
+ return this.request<T>(merge({ url, data, method: 'PUT' }, option));
314
+ }
315
+ /**
316
+ * PATCH 请求
317
+ */
318
+ patch<T = unknown>(url: string, data?: unknown, option?: HttpRequestConfig): Promise<T> {
319
+ return this.request<T>(merge({ url, data, method: 'PATCH' }, option));
320
+ }
321
+ /**
322
+ * HEAD 请求
323
+ */
324
+ head<T = unknown>(url: string, data?: unknown, option?: HttpRequestConfig): Promise<T> {
325
+ return this.request<T>(merge({ url, data, method: 'HEAD' }, option));
326
+ }
327
+ /**
328
+ * DELETE 请求
329
+ */
330
+ delete<T = unknown>(url: string, data?: unknown, option?: HttpRequestConfig): Promise<T> {
331
+ return this.request<T>(merge({ url, data, method: 'DELETE' }, option));
332
+ }
333
+ /**
334
+ * UPLOAD 文件上传
335
+ */
336
+ upload<T = unknown>(url: string, data?: unknown, option?: HttpRequestConfig): Promise<T> {
337
+ return this.request<T>(merge({ url, data, method: 'UPLOAD' }, option));
338
+ }
339
+
340
+ /**
341
+ * 拦截器锁定
342
+ */
343
+ lock(): void {
344
+ const fn = this.interceptors.request.lock;
345
+ if (typeof fn === 'function') {
346
+ fn.call(this.interceptors.request);
347
+ }
348
+ }
349
+ /**
350
+ * 拦截器解锁
351
+ */
352
+ unlock(): void {
353
+ const fn = this.interceptors.request.unlock;
354
+ if (typeof fn === 'function') {
355
+ fn.call(this.interceptors.request);
356
+ }
357
+ }
358
+ /**
359
+ * 拦截器清空
360
+ */
361
+ clear(): void {
362
+ const fn = this.interceptors.request.clear;
363
+ if (typeof fn === 'function') {
364
+ fn.call(this.interceptors.request);
365
+ }
366
+ }
367
+ }
368
+
369
+ // 数据合并
370
+ function merge(a: any, b: any): any {
371
+ for (const key in b) {
372
+ if (!a.hasOwnProperty(key)) {
373
+ a[key] = b[key];
374
+ } else if (isObject(b[key], 1) && isObject(a[key], 1)) {
375
+ merge(a[key], b[key]);
376
+ }
377
+ }
378
+ return a;
379
+ }
380
+
381
+ function isObject(ob: any, real?: number): boolean {
382
+ if (real) {
383
+ return Object.prototype.toString.call(ob).slice(8, -1).toLowerCase() === 'object';
384
+ } else {
385
+ return ob && typeof ob === 'object';
386
+ }
387
+ }
388
+
389
+ function isArray(value: any): value is any[] {
390
+ return Array.isArray(value);
391
+ }
392
+
393
+ function wrap(interceptor: Interceptor) {
394
+ let resolve: ((value?: unknown) => void) | null;
395
+ let reject: ((reason?: any) => void) | null;
396
+ function _clear() {
397
+ interceptor.p = resolve = reject = null;
398
+ }
399
+ merge(interceptor, {
400
+ lock() {
401
+ if (!resolve) {
402
+ interceptor.p = new Promise((_resolve, _reject) => {
403
+ resolve = _resolve;
404
+ reject = _reject;
405
+ });
406
+ }
407
+ },
408
+ unlock() {
409
+ if (resolve) {
410
+ resolve();
411
+ _clear();
412
+ }
413
+ },
414
+ clear() {
415
+ if (reject) {
416
+ reject('cancel');
417
+ _clear();
418
+ }
419
+ }
420
+ });
421
+ }
422
+
423
+ /**
424
+ * useHttp hooks 工厂函数,推荐唯一入口
425
+ * @param options 可选的全局配置
426
+ * @returns http 实例(包含 get/post/put/delete 等方法和拦截器)
427
+ */
428
+ export function useHttp(options: HttpRequestConfig = {}) {
429
+ const http = new Http(options);
430
+ return http;
431
+ }
432
+
433
+ // 只导出 useHttp,不再导出 Http 类实例化方式
434
+ export default useHttp;
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "id": "uview-pro",
3
3
  "name": "uview-pro",
4
- "displayName": "uView Pro是uni-app全面兼容Vue3+TS的uni-app生态框架,70+精选组件",
5
- "version": "0.0.3",
6
- "description": "uView Pro,是uni-app全面兼容Vue3的uni-app生态框架,70+精选组件已使用TypeScript重构,已全面支持uni-app Vue3.0",
4
+ "displayName": "uView Pro是uni-app全面支持Vue3+TS的uni-app生态框架,70+精选组件",
5
+ "version": "0.0.5",
6
+ "description": "uView Pro,是uni-app全面支持Vue3的uni-app生态框架,70+精选组件已使用TypeScript重构,已全面支持uni-app Vue3.0",
7
7
  "main": "index.ts",
8
8
  "module": "index.ts",
9
9
  "browser": "index.ts",
@@ -58,6 +58,8 @@
58
58
  "app-vue": "y",
59
59
  "app-nvue": "n",
60
60
  "app-uvue": "n",
61
+ "app-android": "y",
62
+ "app-ios": "y",
61
63
  "app-harmony": "u"
62
64
  },
63
65
  "H5-mobile": {
package/readme.md CHANGED
@@ -9,6 +9,10 @@
9
9
  [![stars](https://img.shields.io/github/stars/anyup/uView-Pro?style=flat-square&logo=GitHub)](https://github.com/anyup/uView-Pro)
10
10
  [![forks](https://img.shields.io/github/forks/anyup/uView-Pro?style=flat-square&logo=GitHub)](https://github.com/anyup/uView-Pro)
11
11
  [![issues](https://img.shields.io/github/issues/anyup/uView-Pro?style=flat-square&logo=GitHub)](https://github.com/anyup/uView-Pro/issues)
12
+ [![npm version](https://img.shields.io/npm/v/uview-pro)](https://www.npmjs.com/package/uview-pro)
13
+ [![Website](https://img.shields.io/badge/uView%20Pro-docs-blue?style=flat-square)](https://uview-pro.anyup.cn/)
14
+ [![node version](https://img.shields.io/badge/node-%3E%3D18-green)](https://nodejs.org/)
15
+ [![pnpm version](https://img.shields.io/badge/pnpm-%3E%3D7.30-green)](https://pnpm.io/)
12
16
  [![license](https://img.shields.io/github/license/anyup/uView-Pro?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License)
13
17
 
14
18
  ## 说明
@@ -17,12 +21,12 @@ uView UI,是 [uni-app](https://uniapp.dcloud.io/) 生态优秀的 UI 框架,
17
21
 
18
22
  uView Pro,是全面支持 Vue3.0、TypeScript 的 uni-app 生态框架,uView Pro 的基线版本是基于 uView 1.8.8 修改,使用 TypeScript 完全重构,目前已全面支持 uni-app Vue3.0。
19
23
 
20
- ## [官方文档:https://uview-pro.anyup.cn/](https://uview-pro.anyup.cn/)
24
+ ## [官方文档:https://uview-pro.netlify.app/](https://uview-pro.netlify.app/)
21
25
 
22
26
  ## 特性
23
27
 
24
28
  - 兼容安卓,iOS,微信小程序,H5,QQ 小程序,百度小程序,支付宝小程序,头条小程序
25
- - 60+精选组件,功能丰富,多端兼容,让您快速集成,开箱即用
29
+ - 70+精选组件,功能丰富,多端兼容,让您快速集成,开箱即用
26
30
  - 众多贴心的 JS 利器,让您飞镖在手,召之即来,百步穿杨
27
31
  - 众多的常用页面和布局,让您专注逻辑,事半功倍
28
32
  - 详尽的文档支持,现代化的演示效果
@@ -52,13 +56,11 @@ pnpm install
52
56
  pnpm dev
53
57
  ```
54
58
 
55
-
56
-
57
59
  ## 链接
58
60
 
59
61
  - [Github](https://github.com/anyup/uview-pro)
60
62
  - [Gitee](https://gitee.com/anyup/uview-pro)
61
- - [官方文档](https://uview-pro.anyup.cn/)
63
+ - [官方文档](https://uview-pro.netlify.app/)
62
64
  - [更新日志](https://github.com/anyup/uView-Pro/blob/master/src/uni_modules/uview-pro/changelog.md)
63
65
 
64
66
  ## 交流反馈
@@ -67,7 +69,7 @@ uView Pro QQ 交流群: [点击进入](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027
67
69
 
68
70
  <table class="table">
69
71
  <tr>
70
- <td><img src="https://ik.imagekit.io/anyup/images/social/weixin-chat.png" width="250" height="345" ></td>
72
+ <td><img src="https://ik.imagekit.io/anyup/images/social/weixin-chat.png?updatedAt=1755597368053" width="250" height="345" ></td>
71
73
  <td><img src="https://ik.imagekit.io/anyup/images/social/qq-chat.png" width="250" height="345" ></td>
72
74
  </tr>
73
75
  <tr>
@@ -99,7 +101,7 @@ pnpm add uview-pro
99
101
 
100
102
  #### **插件市场下载**
101
103
 
102
- [https://p.dcloud.net.cn/plugin?name=uview-pro](https://p.dcloud.net.cn/plugin?name=uview-pro)
104
+ [https://ext.dcloud.net.cn/plugin?id=24633](https://ext.dcloud.net.cn/plugin?id=24633)
103
105
 
104
106
  ## 快速上手
105
107
 
@@ -108,8 +110,12 @@ pnpm add uview-pro
108
110
  ```js
109
111
  // main.ts
110
112
  import { createSSRApp } from 'vue';
113
+ // npm安装方式
111
114
  import uViewPro from 'uview-pro';
112
115
 
116
+ // uni_modules安装方式
117
+ // import uViewPro from '@/uni_modules/uview-pro';
118
+
113
119
  export function createApp() {
114
120
  const app = createSSRApp(App);
115
121
  app.use(uViewPro);
@@ -125,15 +131,22 @@ export function createApp() {
125
131
  ```css
126
132
  /* App.vue */
127
133
  <style lang="scss">
134
+ /* npm安装方式 */
128
135
  @import "uview-pro/index.scss";
136
+
137
+ /* uni_modules安装方式 */
138
+ /* @import "@/uni_modules/uview-pro/index.scss"; */
129
139
  </style>
130
140
  ```
131
141
 
132
142
  3. `uni.scss`引入全局 scss 变量文件
133
143
 
134
144
  ```css
135
- /* uni.scss */
145
+ /* npm安装方式 */
136
146
  @import 'uview-pro/theme.scss';
147
+
148
+ /* uni_modules安装方式 */
149
+ /* @import '@/uni_modules/uview-pro/theme.scss'; */
137
150
  ```
138
151
 
139
152
  4. `pages.json`配置 easycom 规则(按需引入)
@@ -142,11 +155,14 @@ export function createApp() {
142
155
  // pages.json
143
156
  {
144
157
  "easycom": {
145
- // uni_modules安装的方式需要前面的"@/",npm安装的方式无需"@/"
146
- // npm安装方式
147
- "^u-(.*)": "uview-pro/components/u-$1/u-$1.vue"
148
- // uni_modules安装方式
149
- // "^u-(.*)": "@/uni_modules/uview-pro/components/u-$1/u-$1.vue"
158
+ // 注意一定要放在custom里,否则无效,https://ask.dcloud.net.cn/question/131175
159
+ "custom": {
160
+ // uni_modules安装的方式需要前面的"@/uni_modules/",npm安装的方式无需"@/",以下方式任选其一
161
+ // npm安装方式
162
+ "^u-(.*)": "uview-pro/components/u-$1/u-$1.vue"
163
+ // uni_modules安装方式
164
+ // "^u-(.*)": "@/uni_modules/uview-pro/components/u-$1/u-$1.vue"
165
+ }
150
166
  },
151
167
  // 此为本身已有的内容
152
168
  "pages": [
@@ -155,19 +171,21 @@ export function createApp() {
155
171
  }
156
172
  ```
157
173
 
158
- 请通过[快速上手](https://www.anyup.cn/docs/components/quickstart.html)了解更详细的内容
174
+ 请通过[快速上手](https://uview-pro.netlify.app/components/quickstart.html)了解更详细的内容
159
175
 
160
176
  ## 使用方法
161
177
 
162
178
  配置 easycom 规则后,自动按需引入,无需`import`组件,直接引用即可。
163
179
 
180
+ > 注意:配置完以上规则后,一定要重新运行 uni-app 项目,否则不会生效
181
+
164
182
  ```html
165
183
  <template>
166
184
  <u-button>按钮</u-button>
167
185
  </template>
168
186
  ```
169
187
 
170
- 请通过[快速上手](https://www.anyup.cn/docs/components/quickstart.html)了解更详细的内容
188
+ 请通过[快速上手](https://uview-pro.netlify.app/components/quickstart.html)了解更详细的内容
171
189
 
172
190
  ## 捐赠 uView Pro
173
191