@mijadesign/nut-mcp 1.0.0-alpha.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.
Files changed (58) hide show
  1. package/README.md +147 -0
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +16 -0
  4. package/dist/services/aliases.service.d.ts +1 -0
  5. package/dist/services/aliases.service.js +19 -0
  6. package/dist/services/doc-parser.service.d.ts +3 -0
  7. package/dist/services/doc-parser.service.js +162 -0
  8. package/dist/services/index.services.d.ts +3 -0
  9. package/dist/services/index.services.js +71 -0
  10. package/dist/services/paths.service.d.ts +5 -0
  11. package/dist/services/paths.service.js +18 -0
  12. package/dist/tools/base.tool.d.ts +8 -0
  13. package/dist/tools/base.tool.js +27 -0
  14. package/dist/tools/get-component-doc.tool.d.ts +12 -0
  15. package/dist/tools/get-component-doc.tool.js +40 -0
  16. package/dist/tools/index.d.ts +4 -0
  17. package/dist/tools/index.js +4 -0
  18. package/dist/tools/list-components.tool.d.ts +8 -0
  19. package/dist/tools/list-components.tool.js +32 -0
  20. package/dist/tools/search-components.tool.d.ts +12 -0
  21. package/dist/tools/search-components.tool.js +61 -0
  22. package/dist/types/index.d.ts +33 -0
  23. package/dist/types/index.js +1 -0
  24. package/docs/docs/aliases.json +59 -0
  25. package/docs/docs/components/base/button/index.md +415 -0
  26. package/docs/docs/components/base/cell/index.md +279 -0
  27. package/docs/docs/components/base/configprovider/index.md +215 -0
  28. package/docs/docs/components/base/image/index.md +282 -0
  29. package/docs/docs/components/base/overlay/index.md +288 -0
  30. package/docs/docs/components/dentry/cascader/index.md +1080 -0
  31. package/docs/docs/components/dentry/checkbox/index.md +842 -0
  32. package/docs/docs/components/dentry/datepicker/index.md +489 -0
  33. package/docs/docs/components/dentry/form/index.md +457 -0
  34. package/docs/docs/components/dentry/input/index.md +257 -0
  35. package/docs/docs/components/dentry/picker/index.md +621 -0
  36. package/docs/docs/components/dentry/radio/index.md +364 -0
  37. package/docs/docs/components/dentry/searchbar/index.md +317 -0
  38. package/docs/docs/components/dentry/selector/index.md +295 -0
  39. package/docs/docs/components/dentry/switch/index.md +300 -0
  40. package/docs/docs/components/dentry/textarea/index.md +231 -0
  41. package/docs/docs/components/dentry/uploader/index.md +745 -0
  42. package/docs/docs/components/exhibition/collapse/index.md +339 -0
  43. package/docs/docs/components/exhibition/swiper/index.md +385 -0
  44. package/docs/docs/components/exhibition/tag/index.md +253 -0
  45. package/docs/docs/components/feedback/dialog/index.md +306 -0
  46. package/docs/docs/components/feedback/drag/index.md +164 -0
  47. package/docs/docs/components/feedback/empty/index.md +211 -0
  48. package/docs/docs/components/feedback/infiniteloading/index.md +397 -0
  49. package/docs/docs/components/feedback/noticebar/index.md +175 -0
  50. package/docs/docs/components/feedback/popup/index.md +563 -0
  51. package/docs/docs/components/feedback/pulltorefresh/index.md +254 -0
  52. package/docs/docs/components/feedback/toast/index.md +355 -0
  53. package/docs/docs/components/layout/divider/index.md +162 -0
  54. package/docs/docs/components/layout/grid/index.md +386 -0
  55. package/docs/docs/components/layout/space/index.md +196 -0
  56. package/docs/docs/components/nav/tabs/index.md +955 -0
  57. package/docs/docs/components-index.json +233 -0
  58. package/package.json +34 -0
@@ -0,0 +1,745 @@
1
+ ---
2
+ order: 27
3
+ demoUrl: 'https://frontend.mishudata.com/mobile/demo/#/dentry/pages/uploader/index'
4
+ group:
5
+ title: 数据录入
6
+ order: 5
7
+ ---
8
+
9
+ # Uploader 上传 <Badge>2.0.0</Badge>
10
+
11
+
12
+ 用于将本地的图片或文件上传至服务器。
13
+
14
+ ## 引入
15
+
16
+ ```tsx
17
+ import { Uploader } from '@mijadesign/mjui-react-taro';
18
+ ```
19
+
20
+ ## 示例代码
21
+
22
+ ### 基础用法
23
+
24
+
25
+ ```tsx
26
+ import { AddFill } from '@mijadesign/mobile-icons'
27
+ import { FileItem, Uploader } from '@mijadesign/mjui-react-taro'
28
+ import React, { useState } from 'react'
29
+
30
+ const Demo1 = () => {
31
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
32
+ const onStart = () => {
33
+ console.log('start触发')
34
+ }
35
+ const [list, setList] = useState<FileItem[]>([])
36
+ return (
37
+ <>
38
+ <div style={{ marginBottom: '10px' }}>点击唤起相册支持拍照和添加图片</div>
39
+ <div style={{ display: 'flex', flexDirection: 'row', flexWrap: 'wrap', gap: '12px' }}>
40
+ <Uploader
41
+ value={list}
42
+ onChange={(files) => {
43
+ const newFiles: FileItem[] = files.map((file) => ({
44
+ ...file,
45
+ status: 'success',
46
+ }))
47
+ setTimeout(() => {
48
+ setList(newFiles)
49
+ }, 2000)
50
+ }}
51
+ uploadIcon={<AddFill size={20} color="#006DFC" />}
52
+ uploadLabel={<div style={{ textAlign: 'center' }}>点击选择图片上传</div>}
53
+ onStart={onStart}
54
+ />
55
+ <Uploader url={uploadUrl} onStart={onStart} />
56
+ <Uploader url={uploadUrl} uploadIcon={<AddFill size={20} color="#006DFC" />} onStart={onStart} />
57
+ </div>
58
+ </>
59
+ )
60
+ }
61
+ export default Demo1
62
+
63
+ ```
64
+ >
65
+ > 在使用Uploader组件上传文件时,可能会遇到响应文件信息中文乱码的问题。这通常发生在客户端与服务器端在处理文件编码时不一致的情况下。为了避免这种问题,建议确保服务器端读取文件的编码格式与客户端保持一致。
66
+
67
+ ```javascript
68
+ import React from 'react'
69
+ import { Uploader } from '@nutui/nutui-react'
70
+ // Server Demo
71
+ app.post('/upload', upload.single('file'), (req, res) => {
72
+ const fileEncoding = req.headers['x-file-encoding'] || 'UTF-8';
73
+ const fileContent = iconv.decode(Buffer.from(JSON.stringify(req.file), 'binary'), fileEncoding);
74
+ res.json({ success: true, message: 'File uploaded successfully', data: JSON.parse(fileContent) });
75
+ });
76
+ // Client Demo
77
+ <Uploader url={uploadUrl} headers={{'x-file-encoding': 'UTF-8'}} />
78
+
79
+ ```
80
+
81
+ ### 基础用法
82
+
83
+
84
+ ```tsx
85
+ import { Uploader } from '@mijadesign/mjui-react-taro'
86
+ import React from 'react'
87
+
88
+ const Demo2 = () => {
89
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
90
+ const onStart = () => {
91
+ console.log('start触发')
92
+ }
93
+ return (
94
+ <div>
95
+ <Uploader previewType="list" url={uploadUrl} onStart={onStart} />
96
+ </div>
97
+ )
98
+ }
99
+ export default Demo2
100
+
101
+ ```
102
+
103
+ ### 上传状态
104
+
105
+
106
+ ```tsx
107
+ import { Uploader } from '@mijadesign/mjui-react-taro'
108
+ import { AddFill } from '@mijadesign/mobile-icons'
109
+ import Taro from '@tarojs/taro'
110
+ import React from 'react'
111
+
112
+ const Demo3 = () => {
113
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
114
+
115
+ const onStart = () => {
116
+ console.log('start触发')
117
+ }
118
+
119
+ const colTitleStyle = {
120
+ fontSize: '12px',
121
+ marginBottom: '12px',
122
+ }
123
+
124
+ const onPreview = (currentUrl?: string) => {
125
+ Taro.previewImage({
126
+ current: currentUrl,
127
+ urls: currentUrl ? [currentUrl] : [],
128
+ })
129
+ }
130
+
131
+ return (
132
+ <div style={{ display: 'flex', flexDirection: 'row', flexWrap: 'wrap', gap: '12px' }}>
133
+ <div>
134
+ <div style={colTitleStyle}>默认态</div>
135
+ <Uploader
136
+ url={uploadUrl}
137
+ uploadIcon={<AddFill size={20} color="#006DFC" />}
138
+ uploadLabel={<div style={{ textAlign: 'center' }}>点击选择图片上传</div>}
139
+ onStart={onStart}
140
+ />
141
+ </div>
142
+ <div>
143
+ <div style={colTitleStyle}>上传中</div>
144
+ <Uploader
145
+ url={uploadUrl}
146
+ defaultValue={[
147
+ {
148
+ name: 'demo.jpg',
149
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
150
+ status: 'uploading',
151
+ message: '上传中',
152
+ type: 'image',
153
+ uid: '122',
154
+ },
155
+ ]}
156
+ onStart={onStart}
157
+ />
158
+ </div>
159
+
160
+ <div>
161
+ <div style={colTitleStyle}>上传失败</div>
162
+ <Uploader
163
+ url={uploadUrl}
164
+ defaultValue={[
165
+ {
166
+ name: '文件2.png',
167
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
168
+ status: 'error',
169
+ message: '上传失败',
170
+ type: 'image',
171
+ uid: '123',
172
+ },
173
+ ]}
174
+ onStart={onStart}
175
+ onFileItemClick={() => onPreview('https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF')}
176
+ />
177
+ </div>
178
+
179
+ <div>
180
+ <div style={colTitleStyle}>上传完成</div>
181
+ <Uploader
182
+ url={uploadUrl}
183
+ defaultValue={[
184
+ {
185
+ name: '文件名称超出可视区域',
186
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
187
+ status: 'success',
188
+ message: '上传成功',
189
+ type: 'image',
190
+ uid: '125',
191
+ },
192
+ ]}
193
+ onStart={onStart}
194
+ onFileItemClick={() => onPreview('https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF')}
195
+ />
196
+ </div>
197
+
198
+ <div>
199
+ <div style={colTitleStyle}>上传完成无删除</div>
200
+ <Uploader
201
+ url={uploadUrl}
202
+ defaultValue={[
203
+ {
204
+ name: '文件名称超出可视区域',
205
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
206
+ status: 'success',
207
+ message: '上传成功',
208
+ type: 'image',
209
+ uid: '125',
210
+ },
211
+ ]}
212
+ onStart={onStart}
213
+ deletable={false}
214
+ onFileItemClick={() => onPreview('https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF')}
215
+ />
216
+ </div>
217
+
218
+ <div>
219
+ <div style={colTitleStyle}>上传完成无名称</div>
220
+ <Uploader
221
+ url={uploadUrl}
222
+ defaultValue={[
223
+ {
224
+ name: '文件名称超出可视区域',
225
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
226
+ status: 'success',
227
+ message: '上传成功',
228
+ type: 'image',
229
+ uid: '125',
230
+ },
231
+ ]}
232
+ onStart={onStart}
233
+ tips={false}
234
+ />
235
+ </div>
236
+ </div>
237
+ )
238
+ }
239
+ export default Demo3
240
+
241
+ ```
242
+
243
+ ### 上传文件-基础用法列表展示
244
+
245
+
246
+ ```tsx
247
+ import { Uploader } from '@mijadesign/mjui-react-taro'
248
+ import Taro from '@tarojs/taro'
249
+ import React from 'react'
250
+
251
+ const Demo13 = () => {
252
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
253
+ const defaultFileList: any[] = [
254
+ {
255
+ name: '文件名称超出可视区域',
256
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
257
+ status: 'success',
258
+ message: '上传成功',
259
+ type: 'image',
260
+ uid: '122',
261
+ },
262
+ {
263
+ name: '文件名称超出可视区域',
264
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
265
+ status: 'success',
266
+ message: '上传成功',
267
+ type: 'image',
268
+ uid: '123',
269
+ },
270
+ {
271
+ name: '文件名称超出可视区域',
272
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
273
+ status: 'success',
274
+ message: '上传成功',
275
+ type: 'image',
276
+ uid: '124',
277
+ },
278
+ {
279
+ name: '文件名称超出可视区域',
280
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
281
+ status: 'success',
282
+ message: '上传成功',
283
+ type: 'image',
284
+ uid: '125',
285
+ },
286
+ {
287
+ name: '文件名称超出可视区域',
288
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
289
+ status: 'success',
290
+ message: '上传成功',
291
+ type: 'image',
292
+ uid: '126',
293
+ },
294
+ {
295
+ name: '文件名称超出可视区域',
296
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
297
+ status: 'success',
298
+ message: '上传成功',
299
+ type: 'image',
300
+ uid: '127',
301
+ },
302
+ ]
303
+ const fileList: any[] = [
304
+ {
305
+ name: '文件名称超出可视区域',
306
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
307
+ status: 'success',
308
+ message: '上传成功',
309
+ type: 'image',
310
+ uid: '124',
311
+ },
312
+ {
313
+ name: '文件名称超出可视区域',
314
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
315
+ status: 'success',
316
+ message: 'success',
317
+ type: 'image',
318
+ uid: '125',
319
+ },
320
+ ]
321
+
322
+ const colTitleStyle = {
323
+ fontSize: '12px',
324
+ marginBottom: '12px',
325
+ }
326
+
327
+ const onDelete = (file: any, fileList: any) => {
328
+ console.log('delete事件触发', file, fileList)
329
+ }
330
+
331
+ const onPreview = (currentUrl?: string, urls?: any[]) => {
332
+ Taro.previewImage({
333
+ current: currentUrl,
334
+ urls: urls?.map((i) => i?.url) ?? [],
335
+ })
336
+ }
337
+
338
+ return (
339
+ <div style={{ display: 'block' }}>
340
+ <div>
341
+ <div style={colTitleStyle}>当上传图片数量小于等于3个时:</div>
342
+ <Uploader
343
+ multiple
344
+ maxCount={3}
345
+ url={uploadUrl}
346
+ defaultValue={fileList}
347
+ onDelete={onDelete}
348
+ onFileItemClick={(_, index) => {
349
+ onPreview(fileList[index].url, fileList)
350
+ }}
351
+ />
352
+ </div>
353
+ <div>
354
+ <div style={colTitleStyle}>当上传图片数量大于3个时:</div>
355
+ <Uploader
356
+ multiple
357
+ span={4}
358
+ maxCount={8}
359
+ url={uploadUrl}
360
+ defaultValue={defaultFileList}
361
+ onDelete={onDelete}
362
+ onFileItemClick={(_, index) => {
363
+ onPreview(defaultFileList[index].url, defaultFileList)
364
+ }}
365
+ />
366
+ </div>
367
+ </div>
368
+ )
369
+ }
370
+ export default Demo13
371
+
372
+ ```
373
+
374
+ ### 基础用法-上传列表展示
375
+
376
+
377
+ ```tsx
378
+ import { Button, Uploader } from '@mijadesign/mjui-react-taro'
379
+ import React from 'react'
380
+
381
+ const Demo4 = () => {
382
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
383
+ const defaultFileList: any[] = [
384
+ {
385
+ name: '文件名称超出可视区域',
386
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
387
+ status: 'success',
388
+ message: '上传成功',
389
+ type: 'image',
390
+ uid: '122',
391
+ },
392
+ {
393
+ name: '文件名称超出可视区域',
394
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
395
+ status: 'success',
396
+ message: '上传成功',
397
+ type: 'image',
398
+ uid: '123',
399
+ },
400
+ {
401
+ name: '文件名称超出可视区域',
402
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
403
+ status: 'success',
404
+ message: '上传成功',
405
+ type: 'image',
406
+ uid: '124',
407
+ },
408
+ {
409
+ name: '文件名称超出可视区域',
410
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
411
+ status: 'success',
412
+ message: '上传成功',
413
+ type: 'image',
414
+ uid: '125',
415
+ },
416
+ {
417
+ name: '文件名称超出可视区域',
418
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
419
+ status: 'success',
420
+ message: '上传成功',
421
+ type: 'image',
422
+ uid: '126',
423
+ },
424
+ {
425
+ name: '文件名称超出可视区域',
426
+ url: 'https://t7.baidu.com/it/u=911582538,1619719529&fm=193&f=GIF',
427
+ status: 'success',
428
+ message: '上传成功',
429
+ type: 'image',
430
+ uid: '127',
431
+ },
432
+ ]
433
+
434
+ return (
435
+ <Uploader url={uploadUrl} defaultValue={defaultFileList} maxCount={10} multiple previewType="list">
436
+ <Button type="primary" size="small">
437
+ 上传文件
438
+ </Button>
439
+ </Uploader>
440
+ )
441
+ }
442
+ export default Demo4
443
+
444
+ ```
445
+
446
+ ### 直接调起摄像头(移动端生效)
447
+
448
+
449
+ ```tsx
450
+ import { Uploader } from '@mijadesign/mjui-react-taro'
451
+ import React from 'react'
452
+
453
+ const Demo6 = () => {
454
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
455
+ return (
456
+ <div>
457
+ <Uploader url={uploadUrl} sourceType={['camera']} />
458
+ </div>
459
+ )
460
+ }
461
+ export default Demo6
462
+
463
+ ```
464
+
465
+ ### 使用前摄像头拍摄3s视频并上传(仅支持微信小程序)
466
+
467
+
468
+ ```tsx
469
+ import { Uploader } from '@mijadesign/mjui-react-taro'
470
+ import React from 'react'
471
+
472
+ const Demo7 = () => {
473
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
474
+ return (
475
+ <div>
476
+ <Uploader url={uploadUrl} maxDuration={3} sourceType={['camera']} camera="front" />
477
+ </div>
478
+ )
479
+ }
480
+ export default Demo7
481
+
482
+ ```
483
+
484
+ ### 限制上传数量5个
485
+
486
+
487
+ ```tsx
488
+ import { Uploader } from '@mijadesign/mjui-react-taro'
489
+ import React from 'react'
490
+
491
+ const Demo8 = () => {
492
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
493
+ return (
494
+ <div>
495
+ <Uploader url={uploadUrl} multiple maxCount={5} />
496
+ </div>
497
+ )
498
+ }
499
+ export default Demo8
500
+
501
+ ```
502
+
503
+ ### 限制上传大小(每个文件最大不超过50kb)
504
+
505
+
506
+ ```tsx
507
+ import { Uploader } from '@mijadesign/mjui-react-taro'
508
+ import Taro from '@tarojs/taro'
509
+ import React from 'react'
510
+
511
+ const Demo9 = () => {
512
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
513
+ const onOversize = (files: Taro.chooseImage.ImageFile[]) => {
514
+ console.log('oversize触发文件大小不能超过50kb', files)
515
+ }
516
+ return (
517
+ <div>
518
+ <Uploader url={uploadUrl} multiple maxFileSize={1024 * 50} onOversize={onOversize} />
519
+ </div>
520
+ )
521
+ }
522
+ export default Demo9
523
+
524
+ ```
525
+
526
+ ### 自定义数据 FormData、headers
527
+
528
+
529
+ ```tsx
530
+ import { Uploader } from '@mijadesign/mjui-react-taro'
531
+ import React from 'react'
532
+
533
+ const Demo10 = () => {
534
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
535
+ const formData = {
536
+ custom: 'test',
537
+ }
538
+ return (
539
+ <div>
540
+ <Uploader url={uploadUrl} data={formData} headers={formData} />
541
+ </div>
542
+ )
543
+ }
544
+ export default Demo10
545
+
546
+ ```
547
+
548
+ ### 自定义 Taro.uploadFile 上传方式(before-xhr-upload)
549
+
550
+
551
+ ```tsx
552
+ import { Uploader } from '@mijadesign/mjui-react-taro'
553
+ import React from 'react'
554
+
555
+ const Demo11 = () => {
556
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
557
+ const beforeXhrUpload = (taroUploadFile: any, options: any) => {
558
+ const uploadTask = taroUploadFile({
559
+ url: options.url,
560
+ filePath: options.taroFilePath,
561
+ fileType: options.fileType,
562
+ header: {
563
+ 'Content-Type': 'multipart/form-data',
564
+ ...options.headers,
565
+ },
566
+ formData: options.formData,
567
+ name: options.name,
568
+ success(response: { errMsg: any; statusCode: number; data: string }) {
569
+ if (options.xhrState === response.statusCode) {
570
+ options.onSuccess?.(response, options)
571
+ } else {
572
+ options.onFailure?.(response, options)
573
+ }
574
+ },
575
+ fail(e: any) {
576
+ options.onFailure?.(e, options)
577
+ },
578
+ })
579
+ options.onStart?.(options)
580
+ uploadTask.progress((res: { progress: any; totalBytesSent: any; totalBytesExpectedToSend: any }) => {
581
+ options.onProgress?.(res, options)
582
+ })
583
+ }
584
+ return (
585
+ <div>
586
+ <Uploader url={uploadUrl} method="put" beforeXhrUpload={beforeXhrUpload} />
587
+ </div>
588
+ )
589
+ }
590
+ export default Demo11
591
+
592
+ ```
593
+
594
+ ### 选中文件后,通过按钮手动执行上传
595
+
596
+
597
+ ```tsx
598
+ import { Button, Uploader } from '@mijadesign/mjui-react-taro'
599
+ import React, { useRef } from 'react'
600
+
601
+ interface uploadRefState {
602
+ submit: () => void
603
+ clear: () => void
604
+ }
605
+
606
+ const Demo12 = () => {
607
+ const uploadUrl = 'https://my-json-server.typicode.com/linrufeng/demo/posts'
608
+ const uploadRef = useRef<uploadRefState>(null)
609
+
610
+ const submitUpload = () => {
611
+ ;(uploadRef.current as uploadRefState).submit()
612
+ }
613
+ const clearUpload = () => {
614
+ ;(uploadRef.current as uploadRefState).clear()
615
+ }
616
+ return (
617
+ <div style={{ display: 'block' }}>
618
+ <Uploader url={uploadUrl} maxCount={5} autoUpload={false} ref={uploadRef} />
619
+ <div style={{ display: 'flex', marginTop: '16px' }}>
620
+ <Button type="primary" size="small" onClick={submitUpload} style={{ marginInlineEnd: '10px' }}>
621
+ 执行上传
622
+ </Button>
623
+ <Button type="primary" size="small" onClick={clearUpload}>
624
+ 手动清空上传
625
+ </Button>
626
+ </div>
627
+ </div>
628
+ )
629
+ }
630
+ export default Demo12
631
+
632
+ ```
633
+
634
+ ### 禁用状态
635
+
636
+
637
+ ```tsx
638
+ import { Uploader } from '@mijadesign/mjui-react-taro'
639
+ import React from 'react'
640
+
641
+ const Demo13 = () => {
642
+ return (
643
+ <div>
644
+ <Uploader disabled />
645
+ </div>
646
+ )
647
+ }
648
+ export default Demo13
649
+
650
+ ```
651
+
652
+ ## Uploader
653
+
654
+ ### Props
655
+
656
+ | 字段 | 说明 | 类型 | 默认值 |
657
+ | --- | --- | --- | --- |
658
+ | autoUpload | 是否在选取文件后立即进行上传,false 时需要手动执行 ref submit 方法进行上传 | `boolean` | `true` |
659
+ | name | `input` 标签 `name` 的名称,发到后台的文件参数名 | `string` | `file` |
660
+ | url | 上传服务器的接口地址 | `string` | `-` |
661
+ | defaultValue | 默认已经上传的文件列表 | `FileType<React.ReactNode>[]` | `[]` |
662
+ | value | 已经上传的文件列表 | `FileType<string>[]` | `[]` |
663
+ | preview | 是否上传成功后展示预览图 | `boolean` | `true` |
664
+ | previewUrl | 当上传非图片('image')格式的默认图片地址 | `string` | `-` |
665
+ | deletable | 是否展示删除按钮 | `boolean` | `true` |
666
+ | method | 上传请求的 http method | `string` | `post` |
667
+ | previewType | 上传列表的内建样式,支持两种基本样式 picture、list | `string` | `picture` |
668
+ | maxFileSize | 可以设定最大上传文件的大小(字节) | `number` \| `string` | `Number.MAX_VALUE` |
669
+ | maxCount | 文件上传数量限制 | `number` \| `string` | `1` |
670
+ | fit | 图片填充模式 | `contain` \| `cover` \| `fill` \| `none` \| `scale-down` | `cover` |
671
+ | sourceType | [选择文件的来源]("https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html") | `Array` | `['album','camera']` |
672
+ | camera`仅支持WEAPP` | 仅在 `source-type` 为 `camera` 时生效,使用前置或后置摄像头 | `String` | `back` |
673
+ | sizeType | [是否压缩所选文件]("https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html") | `Array` | `['original','compressed']` |
674
+ | mediaType`仅支持WEAPP` | [选择文件类型]("https://developers.weixin.qq.com/miniprogram/dev/api/media/video/wx.chooseMedia.html") | `Array` | `['image', 'video']` |
675
+ | maxDuration`仅支持WEAPP` | 拍摄视频最长拍摄时间,单位秒。时间范围为 3s 至 60s 之间。不限制相册。 | `number` | `10` |
676
+ | headers | 设置上传的请求头部 | `object` | `{}` |
677
+ | data | 附加上传的信息 formData | `object` | `{}` |
678
+ | uploadIcon | 上传区域icon| `ReactNode` | `<Addcard />` |
679
+ | uploadLabel | 上传区域图片下方文字 | `string` | `&quot;&quot;` |
680
+ | xhrState | 接口响应的成功状态(status)值 | `number` | `200` |
681
+ | disabled | 是否禁用文件上传 | `boolean` | `false` |
682
+ | multiple | 是否支持文件多选 | `boolean` | `false` |
683
+ | timeout | 超时时间,单位为毫秒 | `number` \| `string` | `1000 * 30` |
684
+ | tips | 是否展示描述文案| `boolean` | `true` |
685
+ | span | 上传一行展示| `3` \| `4` | `3` |
686
+ | previewMode | 图片展示模式| `string` | `aspectFill` |
687
+ | beforeXhrUpload | 执行 XHR 上传时,自定义方式 | `(xhr: XMLHttpRequest, options: any) => void` | `-` |
688
+ | beforeDelete | 除文件时的回调,返回值为 false 时不移除。支持返回一个 `Promise` 对象,`Promise` 对象 resolve(false) 或 reject 时不移除 | `(file: FileItem, files: FileItem[]) => boolean` | `-` |
689
+ | onStart | 文件上传开始 | `(option: UploadOptions) => void` | `-` |
690
+ | onProgress | 文件上传的进度 | `(param: {e: ProgressEvent<XMLHttpRequestEventTarget>;option: UploadOptions;percentage: string \| number}) => void` | `-` |
691
+ | onOversize | 文件大小超过限制时触发 | `(param: {responseText: XMLHttpRequest['responseText'];option: UploadOptions;files: FileItem[]}) => void` | `-` |
692
+ | onSuccess | 上传成功 | `(param: {responseText: XMLHttpRequest['responseText'];option: UploadOptions;percentage: string \| number}) => void` | `-` |
693
+ | onFailure | 上传失败 | `(param: {responseText: XMLHttpRequest['responseText'];option: UploadOptions;percentage: string \| number}) => void` | `-` |
694
+ | onChange | 上传文件改变时的状态 | `(param: FileItem[]) => void` | `-` |
695
+ | onDelete | 文件删除之前的状态 | `(file: FileItem, files: FileItem[]) => void` | `-` |
696
+ | onFileItemClick | 文件上传成功后点击触发 | `(file: FileItem, index: number) => void` | `-` |
697
+
698
+ ### FileItem
699
+
700
+ | 名称 | 说明 | 默认值 |
701
+ | --- | --- | --- |
702
+ | status | 文件状态值,可选'ready,uploading,success,error,removed' | `ready` |
703
+ | uid | 文件的唯一标识 | `new Date().getTime().toString()` |
704
+ | name | 文件名称 | `-` |
705
+ | url | 文件路径 | `-` |
706
+ | type | 文件类型 | `image/jpeg` |
707
+ | formData | 上传所需的data | `new FormData()` |
708
+
709
+ ### Methods
710
+
711
+ 通过 ref 可以获取到 Uploader 实例并调用实例方法
712
+
713
+ | 方法名 | 说明 | 参数 | 返回值 |
714
+ | --- | --- | --- | --- |
715
+ | submit | 手动上传模式,执行上传操作 | `-` | `-` |
716
+ | clear | 清空已选择的文件队列(该方法一般配合在手动模式上传时使用) | `index` | `-` |
717
+
718
+ ## 主题定制
719
+
720
+ ### 样式变量
721
+
722
+ 组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](#/zh-CN/component/configprovider)。
723
+
724
+ | 名称 | 说明 | 默认值 |
725
+ | --- | --- | --- |
726
+ | \--nutui-uploader-background | 上传图片的背景颜色 | `$color-background` |
727
+ | \--nutui-uploader-background-disabled | 上传图片禁用状态的背景颜色 | `$color-background` |
728
+ | \--nutui-uploader-image-border | 上传图片的border值 | `0px` |
729
+ | \--nutui-uploader-image-border-radius | 上传图片的border圆角 | `$radius-1` |
730
+ | \--nutui-uploader-image-color | 上传图片的文字颜色 | `$color-text-help` |
731
+ | \--nutui-uploader-image-disabled | 上传图片的禁用状态 | `$color-text-disabled` |
732
+ | \--nutui-uploader-image-height | 上传图片的高度 | `96px` |
733
+ | \--nutui-uploader-image-icon-margin-bottom | 上传区域图片下方文字margin-bottom值 | `$spacing-0` |
734
+ | \--nutui-uploader-image-icon-tip-color | 上传区域图片下方文字颜色 | `$color-text` |
735
+ | \--nutui-uploader-image-icon-tip-font-size | 上传区域图片下方文字大小 | `$font-size-1` |
736
+ | \--nutui-uploader-image-width | 上传图片的宽度 | `96px` |
737
+ | \--nutui-uploader-picture-icon-tip-color | 上传图片icon的文字颜色 | `$color-text` |
738
+ | \--nutui-uploader-preview-close-right | 上传图片关闭按钮的right值 | `0px` |
739
+ | \--nutui-uploader-preview-close-top | 上传图片关闭按钮的top值 | `0px` |
740
+ | \--nutui-uploader-preview-margin-bottom | 上传区域预览margin-bottom的值 | `$spacing-2` |
741
+ | \--nutui-uploader-preview-margin-right | 上传区域预览margin-right的值 | `$spacing-2` |
742
+ | \--nutui-uploader-preview-progress-background | 上传区域预览进度的背景颜色 | `$color-mask-secondary` |
743
+ | \--nutui-uploader-preview-tips-background | 上传图片预览tips下的背景颜色 | `$color-mask` |
744
+ | \--nutui-uploader-preview-tips-height | 上传图片预览tips下的高度 | `24px` |
745
+ | \--nutui-uploader-preview-tips-padding | 上传图片预览tips下的padding值 | `0 $spacing-0` |