@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,1080 @@
1
+ ---
2
+ order: 5
3
+ demoUrl: 'https://frontend.mishudata.com/mobile/demo/#/dentry/pages/cascader/index'
4
+ group:
5
+ title: 数据录入
6
+ order: 5
7
+ ---
8
+
9
+ # Cascader 级联选择 <Badge>2.0.0</Badge>
10
+
11
+
12
+ 级联选择器,用于多层级数据的选择,典型场景为省市区选择。
13
+
14
+ ## 引入
15
+
16
+ ```tsx
17
+ import { Cascader } from '@mijadesign/mjui-react-taro';
18
+ ```
19
+
20
+ ## 示例代码
21
+
22
+ ### 基础用法
23
+
24
+ 传入`options`列表
25
+
26
+
27
+ ```tsx
28
+ import { Cascader, Cell } from '@mijadesign/mjui-react-taro'
29
+ import { ArrowRight } from '@nutui/icons-react-taro'
30
+ import React, { useState } from 'react'
31
+
32
+ const Demo1 = () => {
33
+ const [isVisibleDemo1, setIsVisibleDemo1] = useState(false)
34
+ const [value1, setValue1] = useState([])
35
+ const change1 = (value: any, path: any) => {
36
+ console.log('onChange', value, path)
37
+ setValue1(value)
38
+ }
39
+
40
+ const formatCascaderItem = (res: any, render: boolean) => {
41
+ return {
42
+ ...res,
43
+ render: (_: any, record: any) => {
44
+ if (render) {
45
+ return (
46
+ <div className="cascaderItemContent">
47
+ <div className="prefix">{record?.prefixChar}</div>
48
+ <div>{record?.text}</div>
49
+ </div>
50
+ )
51
+ }
52
+ },
53
+ }
54
+ }
55
+
56
+ const formatOptions = (options: any[], render: boolean): any[] => {
57
+ return options.map((item) => {
58
+ const newItem = formatCascaderItem(item, render)
59
+ if (item.children && item.level < 2) {
60
+ newItem.children = formatOptions(item.children, render)
61
+ }
62
+ return newItem
63
+ })
64
+ }
65
+
66
+ const onLoad = async (node: any, resolve: any) => {
67
+ const level = node?.root ? 0 : node.level + 1
68
+ resolve(optionsDemo1?.map((item: any) => formatCascaderItem(item, level < 2)))
69
+ }
70
+
71
+ const [optionsDemo1] = useState(() =>
72
+ formatOptions(
73
+ [
74
+ {
75
+ value: '浙江',
76
+ text: '浙江',
77
+ prefixChar: 'Z',
78
+ level: 1,
79
+ children: [
80
+ {
81
+ value: '杭州',
82
+ text: '杭州',
83
+ disabled: true,
84
+ prefixChar: 'H',
85
+ level: 2,
86
+ children: [
87
+ { value: '西湖区', text: '西湖区', disabled: true, level: 3 },
88
+ { value: '余杭区', text: '余杭区', level: 3 },
89
+ ],
90
+ },
91
+ {
92
+ value: '温州',
93
+ text: '温州',
94
+ prefixChar: 'W',
95
+ level: 2,
96
+ children: [
97
+ { value: '鹿城区', text: '鹿城区', level: 3 },
98
+ { value: '瓯海区', text: '瓯海区', level: 3 },
99
+ ],
100
+ },
101
+ ],
102
+ },
103
+ {
104
+ value: '湖南',
105
+ text: '湖南',
106
+ level: 1,
107
+ prefixChar: 'H',
108
+ disabled: true,
109
+ children: [
110
+ {
111
+ value: '长沙',
112
+ text: '长沙',
113
+ level: 2,
114
+ prefixChar: 'C',
115
+ disabled: true,
116
+ children: [
117
+ { value: '西湖区', text: '西湖区', level: 3 },
118
+ { value: '余杭区', text: '余杭区', level: 3 },
119
+ ],
120
+ },
121
+ {
122
+ value: '温州',
123
+ text: '温州',
124
+ prefixChar: 'W',
125
+ level: 2,
126
+ children: [
127
+ { value: '鹿城区', text: '鹿城区', level: 3 },
128
+ { value: '瓯海区', text: '瓯海区', level: 3 },
129
+ ],
130
+ },
131
+ ],
132
+ },
133
+ {
134
+ value: '福建',
135
+ text: '福建',
136
+ level: 1,
137
+ prefixChar: 'F',
138
+ children: [
139
+ {
140
+ value: '福州',
141
+ text: '福州',
142
+ level: 2,
143
+ prefixChar: 'F',
144
+ children: [
145
+ { value: '鼓楼区', text: '鼓楼区', level: 3 },
146
+ { value: '台江区', text: '台江区', level: 3 },
147
+ ],
148
+ },
149
+ ],
150
+ },
151
+ ],
152
+ true
153
+ )
154
+ )
155
+
156
+ return (
157
+ <>
158
+ <Cell
159
+ title="选择地址"
160
+ extra={
161
+ <>
162
+ <div style={{ color: value1.length ? 'rgba(0,0,0,0.95)' : 'rgba(0,0,0,0.4)', marginRight: '4px' }}>
163
+ {value1.length ? value1.join(' ') : '请选择'}
164
+ </div>
165
+ <ArrowRight color="#999" />
166
+ </>
167
+ }
168
+ onClick={() => {
169
+ setIsVisibleDemo1(true)
170
+ }}
171
+ />
172
+ <Cascader
173
+ popupProps={{
174
+ className: 'cascader-popup',
175
+ }}
176
+ visible={isVisibleDemo1}
177
+ value={value1}
178
+ title="选择地址"
179
+ options={optionsDemo1}
180
+ closeable
181
+ onClose={() => {
182
+ setIsVisibleDemo1(false)
183
+ }}
184
+ onChange={change1}
185
+ />
186
+
187
+ {/* <Cell
188
+ title="选择地址1"
189
+ extra={value1.length ? value1 : '请选择地址'}
190
+ onClick={() => {
191
+ setIsVisibleDemo1(true)
192
+ }}
193
+ /> */}
194
+ </>
195
+ )
196
+ }
197
+ export default Demo1
198
+
199
+ ```
200
+
201
+ ### 自定义属性名称
202
+
203
+ 可通过`textKey`、`valueKey`、`childrenKey`指定属性名。
204
+
205
+
206
+ ```tsx
207
+ import { Cascader, Cell } from '@mijadesign/mjui-react-taro'
208
+ import React, { useState } from 'react'
209
+
210
+ const Demo2 = () => {
211
+ const [isVisibleDemo2, setIsVisibleDemo2] = useState(false)
212
+ const [value2, setValue2] = useState([])
213
+
214
+ const change2 = (value: any, path: any) => {
215
+ console.log('onChange', value, path)
216
+ setValue2(value)
217
+ }
218
+
219
+ const formatCascaderItem = (res: any, render: boolean) => {
220
+ return {
221
+ ...res,
222
+ render: (_: any, record: any) => {
223
+ if (render) {
224
+ return (
225
+ <div className="cascaderItemContent">
226
+ <div className="prefix">{record?.prefixChar}</div>
227
+ <div>{record?.text}</div>
228
+ </div>
229
+ )
230
+ }
231
+ },
232
+ }
233
+ }
234
+
235
+ const formatOptions = (options: any[], render: boolean): any[] => {
236
+ return options.map((item) => {
237
+ const newItem = formatCascaderItem(item, render)
238
+ if (item.items && item.level < 2) {
239
+ newItem.items = formatOptions(item.items, render)
240
+ }
241
+ return newItem
242
+ })
243
+ }
244
+
245
+ const onLoad = async (node: any, resolve: any) => {
246
+ const level = node?.root ? 0 : node.level + 1
247
+ resolve(optionsDemo2?.map((item: any) => formatCascaderItem(item, level < 2)))
248
+ }
249
+
250
+ const [optionsDemo2] = useState(() =>
251
+ formatOptions(
252
+ [
253
+ {
254
+ value1: '浙江',
255
+ text1: '浙江',
256
+ prefixChar: 'Z',
257
+ level: 1,
258
+ items: [
259
+ {
260
+ value1: '杭州',
261
+ text1: '杭州',
262
+ disabled: true,
263
+ prefixChar: 'H',
264
+ level: 2,
265
+ items: [
266
+ { value1: '西湖区', text1: '西湖区', disabled: true, level: 3 },
267
+ { value1: '余杭区', text1: '余杭区', level: 3 },
268
+ ],
269
+ },
270
+ {
271
+ value1: '温州',
272
+ text1: '温州',
273
+ prefixChar: 'W',
274
+ level: 2,
275
+ items: [
276
+ { value1: '鹿城区', text1: '鹿城区', level: 3 },
277
+ { value1: '瓯海区', text1: '瓯海区', level: 3 },
278
+ ],
279
+ },
280
+ ],
281
+ },
282
+ {
283
+ value1: '湖南',
284
+ text1: '湖南',
285
+ level: 1,
286
+ prefixChar: 'H',
287
+ disabled: true,
288
+ items: [
289
+ {
290
+ value1: '长沙',
291
+ text1: '长沙',
292
+ level: 2,
293
+ prefixChar: 'C',
294
+ disabled: true,
295
+ items: [
296
+ { value1: '西湖区', text1: '西湖区', level: 3 },
297
+ { value1: '余杭区', text1: '余杭区', level: 3 },
298
+ ],
299
+ },
300
+ {
301
+ value1: '温州',
302
+ text1: '温州',
303
+ prefixChar: 'W',
304
+ level: 2,
305
+ items: [
306
+ { value1: '鹿城区', text1: '鹿城区', level: 3 },
307
+ { value1: '瓯海区', text1: '瓯海区', level: 3 },
308
+ ],
309
+ },
310
+ ],
311
+ },
312
+ {
313
+ value1: '福建',
314
+ text1: '福建',
315
+ level: 1,
316
+ prefixChar: 'F',
317
+ items: [
318
+ {
319
+ value1: '福州',
320
+ text1: '福州',
321
+ level: 2,
322
+ prefixChar: 'F',
323
+ items: [
324
+ { value1: '鼓楼区', text1: '鼓楼区', level: 3 },
325
+ { value1: '台江区', text1: '台江区', level: 3 },
326
+ ],
327
+ },
328
+ ],
329
+ },
330
+ ],
331
+ true
332
+ )
333
+ )
334
+
335
+ return (
336
+ <>
337
+ <Cell
338
+ title="选择地址"
339
+ extra={
340
+ <div style={{ color: value2.length ? 'rgba(0,0,0,0.95)' : 'rgba(0,0,0,0.4)' }}>
341
+ {value2.length ? value2.join(' ') : '省、市、区、街道'}
342
+ </div>
343
+ }
344
+ onClick={() => {
345
+ setIsVisibleDemo2(true)
346
+ }}
347
+ />
348
+ <Cascader
349
+ visible={isVisibleDemo2}
350
+ defaultValue={value2}
351
+ title="选择地址"
352
+ options={optionsDemo2}
353
+ onLoad={onLoad}
354
+ optionKey={{
355
+ textKey: 'text1',
356
+ valueKey: 'value1',
357
+ childrenKey: 'items',
358
+ }}
359
+ closeable
360
+ onClose={() => {
361
+ setIsVisibleDemo2(false)
362
+ }}
363
+ onChange={change2}
364
+ />
365
+ </>
366
+ )
367
+ }
368
+ export default Demo2
369
+
370
+ ```
371
+
372
+ ### 动态加载
373
+
374
+ 使用`lazy`标识是否需要动态获取数据,此时不传`options`代表所有数据都需要通过`onLoad`加载,首次加载通过`root`属性区分,当遇到非叶子节点时会调用`onLoad`方法,参数为当前节点和`resolve`方法,注意`resolve`方法必须调用,不传子节点时会被当做叶子节点处理。
375
+
376
+
377
+ ```tsx
378
+ import { Cascader, Cell } from '@mijadesign/mjui-react-taro'
379
+ import React, { useState } from 'react'
380
+
381
+ const Demo3 = () => {
382
+ const [isVisibleDemo3, setIsVisibleDemo3] = useState(false)
383
+ const [value3, setValue3] = useState(['A0', 'A12', 'A23', 'A32'])
384
+
385
+ const lazyLoadDemo3 = (node: any, resolve: (children: any) => void) => {
386
+ setTimeout(() => {
387
+ if (node.root) {
388
+ resolve([
389
+ { value: 'A0', text: 'A0' },
390
+ { value: 'B0', text: 'B0' },
391
+ { value: 'C0', text: 'C0' },
392
+ ])
393
+ } else {
394
+ const { value, level } = node
395
+ const text = value.substring(0, 1)
396
+ const value1 = `${text}${level + 1}1`
397
+ const value2 = `${text}${level + 1}2`
398
+ const value3 = `${text}${level + 1}3`
399
+ resolve([
400
+ { value: value1, text: value1, leaf: level >= 6 },
401
+ { value: value2, text: value2, leaf: level >= 6 },
402
+ { value: value3, text: value3, leaf: level >= 6 },
403
+ ])
404
+ }
405
+ }, 500)
406
+ }
407
+ const change3 = (value: any, path: any) => {
408
+ console.log('onChange', value, path)
409
+ setValue3(value)
410
+ }
411
+ return (
412
+ <>
413
+ <Cell
414
+ title="选择地址"
415
+ extra={
416
+ <div style={{ color: value3.length ? 'rgba(0,0,0,0.95)' : 'rgba(0,0,0,0.4)' }}>
417
+ {value3.length ? value3.join(' ') : '请选择地址'}
418
+ </div>
419
+ }
420
+ onClick={() => {
421
+ setIsVisibleDemo3(true)
422
+ }}
423
+ />
424
+ <Cascader
425
+ visible={isVisibleDemo3}
426
+ defaultValue={value3}
427
+ title="选择地址"
428
+ closeable
429
+ onClose={() => {
430
+ setIsVisibleDemo3(false)
431
+ }}
432
+ onChange={change3}
433
+ lazy
434
+ onLoad={lazyLoadDemo3}
435
+ />
436
+ </>
437
+ )
438
+ }
439
+ export default Demo3
440
+
441
+ ```
442
+
443
+ ### 部分数据动态加载
444
+
445
+
446
+ ```tsx
447
+ import { Cascader, Cell } from '@mijadesign/mjui-react-taro'
448
+ import React, { useState } from 'react'
449
+
450
+ const Demo4 = () => {
451
+ const [isVisibleDemo4, setIsVisibleDemo4] = useState(false)
452
+ const [value4, setValue4] = useState([])
453
+ const [optionsDemo4] = useState([
454
+ { value: 'A0', text: 'A0' },
455
+ {
456
+ value: 'B0',
457
+ text: 'B0',
458
+ children: [
459
+ { value: 'B11', text: 'B11', leaf: true },
460
+ { value: 'B12', text: 'B12' },
461
+ ],
462
+ },
463
+ { value: 'C0', text: 'C0' },
464
+ ])
465
+
466
+ const lazyLoadDemo4 = (node: any, resolve: (children: any) => void) => {
467
+ setTimeout(() => {
468
+ const { value, level } = node
469
+ const text = value.substring(0, 1)
470
+ const value1 = `${text}${level + 1}1`
471
+ const value2 = `${text}${level + 1}2`
472
+ resolve([
473
+ { value: value1, text: value1, leaf: level >= 2 },
474
+ { value: value2, text: value2, leaf: level >= 1 },
475
+ ])
476
+ }, 500)
477
+ }
478
+ const change4 = (value: any, path: any) => {
479
+ console.log('onChange', value, path)
480
+ setValue4(value)
481
+ }
482
+
483
+ return (
484
+ <>
485
+ <Cell
486
+ title="选择地址"
487
+ extra={
488
+ <div style={{ color: value4.length ? 'rgba(0,0,0,0.95)' : 'rgba(0,0,0,0.4)' }}>
489
+ {value4.length ? value4.join(' ') : '请选择地址'}
490
+ </div>
491
+ }
492
+ onClick={() => {
493
+ setIsVisibleDemo4(true)
494
+ }}
495
+ />
496
+ <Cascader
497
+ visible={isVisibleDemo4}
498
+ defaultValue={value4}
499
+ title="选择地址"
500
+ options={optionsDemo4}
501
+ closeable
502
+ onClose={() => {
503
+ setIsVisibleDemo4(false)
504
+ }}
505
+ onChange={change4}
506
+ lazy
507
+ onLoad={lazyLoadDemo4}
508
+ />
509
+ </>
510
+ )
511
+ }
512
+ export default Demo4
513
+
514
+ ```
515
+
516
+ ### 自动转换
517
+
518
+ 如果你的数据为可转换为树形结构的扁平结构时,可以通过`format`告诉组件需要进行自动转换,`format`接受4个参数,`topId`为顶层节点的父级id,`idKey`为节点唯一id,`pidKey`为指向父节点id的属性名,存在`sortKey`将根据指定字段调用Array.prototype.sort()进行同层排序。
519
+
520
+
521
+ ```tsx
522
+ import { Cascader, Cell } from '@mijadesign/mjui-react-taro'
523
+ import React, { useState } from 'react'
524
+
525
+ const Demo5 = () => {
526
+ const [isVisibleDemo5, setIsVisibleDemo5] = useState(false)
527
+ const [value5, setValue5] = useState(['广东省', '广州市'])
528
+ const [optionsDemo5] = useState([
529
+ { value: '北京', text: '北京', id: 1, pidd: null },
530
+ { value: '朝阳区', text: '朝阳区', id: 11, pidd: 1 },
531
+ { value: '亦庄', text: '亦庄', id: 111, pidd: 11 },
532
+ { value: '广东省', text: '广东省', id: 2, pidd: null },
533
+ { value: '广州市', text: '广州市', id: 21, pidd: 2 },
534
+ ])
535
+ const [convertConfigDemo5, setConvertConfigDemo5] = useState({
536
+ topId: null,
537
+ idKey: 'id',
538
+ pidKey: 'pidd',
539
+ sortKey: '',
540
+ })
541
+ const change5 = (value: any, path: any) => {
542
+ console.log('onChange', value, path)
543
+ setValue5(value)
544
+ }
545
+
546
+ return (
547
+ <>
548
+ <Cell
549
+ title="选择地址"
550
+ extra={
551
+ <div style={{ color: value5.length ? 'rgba(0,0,0,0.95)' : 'rgba(0,0,0,0.4)' }}>
552
+ {value5.length ? value5.join(' ') : '请选择地址'}
553
+ </div>
554
+ }
555
+ onClick={() => {
556
+ setIsVisibleDemo5(true)
557
+ }}
558
+ />
559
+ <Cascader
560
+ visible={isVisibleDemo5}
561
+ defaultValue={value5}
562
+ title="选择地址"
563
+ options={optionsDemo5}
564
+ format={convertConfigDemo5}
565
+ closeable
566
+ onClose={() => {
567
+ setIsVisibleDemo5(false)
568
+ }}
569
+ onChange={change5}
570
+ />
571
+ </>
572
+ )
573
+ }
574
+ export default Demo5
575
+
576
+ ```
577
+
578
+ ### 自定义内容
579
+
580
+
581
+
582
+ ```tsx
583
+ import { Cascader, Cell, ConfigProvider } from '@mijadesign/mjui-react-taro'
584
+ import React, { useState } from 'react'
585
+
586
+ const customTheme = {
587
+ nutuiCascaderItemHeight: '48px',
588
+ nutuiCascaderItemMargin: '0 10px',
589
+ nutuiCascaderItemPadding: '10px',
590
+ nutuiCascaderItemBorderBottom: '1px solid #F0F0F0',
591
+ nutuiTabsTitlesItemActiveColor: '#3768FA',
592
+ nutuiTabsTabLineColor: '#3768FA',
593
+ }
594
+
595
+ const Demo6 = () => {
596
+ const [isVisibleDemo6, setIsVisibleDemo6] = useState(false)
597
+ const [value6, setValue6] = useState([])
598
+ const [optionsDemo6] = useState([
599
+ {
600
+ value: '浙江',
601
+ text: '浙江',
602
+ children: [
603
+ {
604
+ value: '杭州',
605
+ text: '杭州',
606
+ disabled: true,
607
+ children: [
608
+ { value: '西湖区', text: '西湖区', disabled: true },
609
+ { value: '余杭区', text: '余杭区' },
610
+ ],
611
+ },
612
+ {
613
+ value: '温州',
614
+ text: '温州',
615
+ children: [
616
+ { value: '鹿城区', text: '鹿城区' },
617
+ { value: '瓯海区', text: '瓯海区' },
618
+ ],
619
+ },
620
+ ],
621
+ },
622
+ {
623
+ value: '湖南',
624
+ text: '湖南',
625
+ disabled: true,
626
+ children: [
627
+ {
628
+ value: '长沙',
629
+ text: '长沙',
630
+ disabled: true,
631
+ children: [
632
+ { value: '西湖区', text: '西湖区' },
633
+ { value: '余杭区', text: '余杭区' },
634
+ ],
635
+ },
636
+ {
637
+ value: '温州',
638
+ text: '温州',
639
+ children: [
640
+ { value: '鹿城区', text: '鹿城区' },
641
+ { value: '瓯海区', text: '瓯海区' },
642
+ ],
643
+ },
644
+ ],
645
+ },
646
+ {
647
+ value: '福建',
648
+ text: '福建',
649
+ children: [
650
+ {
651
+ value: '福州',
652
+ text: '福州',
653
+ children: [
654
+ { value: '鼓楼区', text: '鼓楼区' },
655
+ { value: '台江区', text: '台江区' },
656
+ ],
657
+ },
658
+ ],
659
+ },
660
+ ])
661
+ const change6 = (value: any, path: any) => {
662
+ console.log('onChange', value, path)
663
+ setValue6(value)
664
+ }
665
+ const onPathChange = (value: any, path: any) => {
666
+ console.log('onPathChange', value, path)
667
+ }
668
+
669
+ return (
670
+ <>
671
+ <Cell
672
+ title="选择地址"
673
+ extra={
674
+ <div style={{ color: value6.length ? 'rgba(0,0,0,0.95)' : 'rgba(0,0,0,0.4)' }}>
675
+ {value6.length ? value6.join(' ') : '请选择地址'}
676
+ </div>
677
+ }
678
+ onClick={() => {
679
+ setIsVisibleDemo6(true)
680
+ }}
681
+ />
682
+ <ConfigProvider theme={customTheme}>
683
+ <Cascader
684
+ visible={isVisibleDemo6}
685
+ activeColor="#3768FA"
686
+ defaultValue={value6}
687
+ title="选择地址"
688
+ options={optionsDemo6}
689
+ closeable
690
+ activeIcon="star"
691
+ onClose={() => {
692
+ setIsVisibleDemo6(false)
693
+ }}
694
+ onChange={change6}
695
+ onPathChange={onPathChange}
696
+ />{' '}
697
+ </ConfigProvider>
698
+ </>
699
+ )
700
+ }
701
+ export default Demo6
702
+
703
+ ```
704
+
705
+ ### 自定义底部内容
706
+
707
+
708
+
709
+ ```tsx
710
+ import { Cascader, Cell } from '@mijadesign/mjui-react-taro'
711
+ import { ArrowRight } from '@nutui/icons-react-taro'
712
+ import React, { useState } from 'react'
713
+
714
+ const customTheme = {
715
+ nutuiCascaderItemHeight: '48px',
716
+ nutuiCascaderItemMargin: '0 10px',
717
+ nutuiCascaderItemPadding: '10px',
718
+ nutuiCascaderItemBorderBottom: '1px solid #F0F0F0',
719
+ nutuiTabsTitlesItemActiveColor: '#3768FA',
720
+ nutuiTabsTabLineColor: '#3768FA',
721
+ }
722
+
723
+ const Demo6 = () => {
724
+ const [isVisibleDemo7, setIsVisibleDemo7] = useState(false)
725
+ const [value7, setValue7] = useState([])
726
+ const insuranceList = [
727
+ {
728
+ address: '北京市',
729
+ childList: [
730
+ {
731
+ address: '北京市',
732
+ childList: null,
733
+ code: 'CPIC0001',
734
+ createTime: '2024-03-20 00:00:00',
735
+ creator: 'system',
736
+ enableSelect: 1,
737
+ id: '101',
738
+ logo: null,
739
+ modifier: 'system',
740
+ modifyTime: '2024-03-20 00:00:00',
741
+ name: '中国太平洋财产保险',
742
+ nameAlias: '中国太平洋财产保险',
743
+ orders: 1,
744
+ parentId: '100',
745
+ personPhone: '13567181902',
746
+ phone: '95500',
747
+ scenes: ['MIJA_QUICK_PAY'],
748
+ specialVisible: 0,
749
+ status: 1,
750
+ subjectType: '1002',
751
+ },
752
+ ],
753
+ code: 'CPIC0000',
754
+ createTime: '2024-03-20 00:00:00',
755
+ creator: 'system',
756
+ enableSelect: 0,
757
+ id: '100',
758
+ logo: 'https://oss.mibaodata.com/static/org_logo/cpic.jpg',
759
+ modifier: 'system',
760
+ modifyTime: '2024-03-20 00:00:00',
761
+ name: '中国太平洋保险',
762
+ nameAlias: '中国太平洋保险',
763
+ orders: 1,
764
+ parentId: '-1',
765
+ personPhone: '13567181902',
766
+ phone: '95500',
767
+ scenes: null,
768
+ specialVisible: 0,
769
+ status: 1,
770
+ subjectType: '1002',
771
+ },
772
+ {
773
+ address: '浙江省杭州市西湖区联合大厦9楼',
774
+ childList: [
775
+ {
776
+ address: '浙江省杭州市西湖区联合大厦9楼',
777
+ childList: null,
778
+ code: 'MIJA0001',
779
+ createTime: '2023-12-27 00:00:00',
780
+ creator: 'system',
781
+ enableSelect: 1,
782
+ id: '11',
783
+ logo: null,
784
+ modifier: 'system',
785
+ modifyTime: '2023-12-27 00:00:00',
786
+ name: '米加商保通演示1',
787
+ nameAlias: '米加商保通演示1',
788
+ orders: 1,
789
+ parentId: '1',
790
+ personPhone: '13296745320',
791
+ phone: '13296745320',
792
+ scenes: ['MIJA_QUICK_PAY'],
793
+ specialVisible: 1,
794
+ status: 1,
795
+ subjectType: '1002',
796
+ },
797
+ {
798
+ address: '浙江省杭州市西湖区联合大厦9楼',
799
+ childList: null,
800
+ code: 'MIJA0002',
801
+ createTime: '2023-12-27 00:00:00',
802
+ creator: 'system',
803
+ enableSelect: 1,
804
+ id: '12',
805
+ logo: null,
806
+ modifier: 'system',
807
+ modifyTime: '2023-12-27 00:00:00',
808
+ name: '米加商保通演示2',
809
+ nameAlias: '米加商保通演示2',
810
+ orders: 2,
811
+ parentId: '1',
812
+ personPhone: '13296745320',
813
+ phone: '13296745320',
814
+ scenes: ['MIJA_QUICK_PAY'],
815
+ specialVisible: 1,
816
+ status: 1,
817
+ subjectType: '1002',
818
+ },
819
+ ],
820
+ code: 'MIJA0000',
821
+ createTime: '2023-12-27 00:00:00',
822
+ creator: 'system',
823
+ enableSelect: 0,
824
+ id: '1',
825
+ logo: 'https://oss.mibaodata.com/static/org_logo/mija.png',
826
+ modifier: 'system',
827
+ modifyTime: '2023-12-27 00:00:00',
828
+ name: '米加商保通演示',
829
+ nameAlias: '米加商保通演示',
830
+ orders: 1,
831
+ parentId: '-1',
832
+ personPhone: '13296745320',
833
+ phone: '13296745320',
834
+ scenes: null,
835
+ specialVisible: 1,
836
+ status: 1,
837
+ subjectType: '1002',
838
+ },
839
+ ]
840
+ const change7 = (value: any, path: any) => {
841
+ console.log('onChange', value, path)
842
+ setValue7(value)
843
+ }
844
+ const onPathChange = (value: any, path: any) => {
845
+ console.log('onPathChange', value, path)
846
+ }
847
+
848
+ return (
849
+ <>
850
+ <Cell
851
+ title="保险公司"
852
+ extra={
853
+ <>
854
+ <div style={{ color: value7.length ? 'rgba(0,0,0,0.95)' : 'rgba(0,0,0,0.4)', marginRight: '4px' }}>
855
+ {value7.length ? value7?.[1] : '请选择保险公司'}
856
+ </div>
857
+ <ArrowRight color="#999" />
858
+ </>
859
+ }
860
+ onClick={() => {
861
+ setIsVisibleDemo7(true)
862
+ }}
863
+ />
864
+ <Cascader
865
+ visible={isVisibleDemo7}
866
+ title="保险公司"
867
+ options={insuranceList.map((item) => ({
868
+ ...item,
869
+ render: (text: string, record: Record<string, any>) => {
870
+ return (
871
+ <div style={{ display: 'flex', alignItems: 'center' }}>
872
+ <img
873
+ alt=""
874
+ src={record.logo}
875
+ style={{
876
+ width: '30px',
877
+ height: '30px',
878
+ marginRight: '8px',
879
+ borderRadius: '50%',
880
+ border: '1px solid rgba(0,0,0,0.1)',
881
+ }}
882
+ />
883
+ <div>{text}</div>
884
+ </div>
885
+ )
886
+ },
887
+ }))}
888
+ optionKey={{
889
+ textKey: 'name',
890
+ valueKey: 'name',
891
+ childrenKey: 'childList',
892
+ }}
893
+ closeable
894
+ onClose={() => {
895
+ setIsVisibleDemo7(false)
896
+ }}
897
+ onChange={change7}
898
+ onPathChange={onPathChange}
899
+ />
900
+ </>
901
+ )
902
+ }
903
+ export default Demo6
904
+
905
+ ```
906
+
907
+ ### 自定义样式
908
+
909
+ 使用configprovider 完成自定义设置
910
+
911
+
912
+ ```tsx
913
+ import { Cascader, Cell, ConfigProvider } from '@mijadesign/mjui-react-taro'
914
+ import React, { useState } from 'react'
915
+
916
+ const customTheme = {
917
+ nutuiCascaderItemHeight: '48px',
918
+ nutuiCascaderItemMargin: '0 10px',
919
+ nutuiCascaderItemPadding: '10px',
920
+ nutuiCascaderItemBorderBottom: '1px solid #F0F0F0',
921
+ nutuiTabsTitlesItemActiveColor: '#3768FA',
922
+ nutuiTabsTabLineColor: '#3768FA',
923
+ }
924
+
925
+ const Demo6 = () => {
926
+ const [isVisibleDemo6, setIsVisibleDemo6] = useState(false)
927
+ const [value6, setValue6] = useState([])
928
+ const [optionsDemo6] = useState([
929
+ {
930
+ value: '浙江',
931
+ text: '浙江',
932
+ children: [
933
+ {
934
+ value: '杭州',
935
+ text: '杭州',
936
+ disabled: true,
937
+ children: [
938
+ { value: '西湖区', text: '西湖区', disabled: true },
939
+ { value: '余杭区', text: '余杭区' },
940
+ ],
941
+ },
942
+ {
943
+ value: '温州',
944
+ text: '温州',
945
+ children: [
946
+ { value: '鹿城区', text: '鹿城区' },
947
+ { value: '瓯海区', text: '瓯海区' },
948
+ ],
949
+ },
950
+ ],
951
+ },
952
+ {
953
+ value: '湖南',
954
+ text: '湖南',
955
+ disabled: true,
956
+ children: [
957
+ {
958
+ value: '长沙',
959
+ text: '长沙',
960
+ disabled: true,
961
+ children: [
962
+ { value: '西湖区', text: '西湖区' },
963
+ { value: '余杭区', text: '余杭区' },
964
+ ],
965
+ },
966
+ {
967
+ value: '温州',
968
+ text: '温州',
969
+ children: [
970
+ { value: '鹿城区', text: '鹿城区' },
971
+ { value: '瓯海区', text: '瓯海区' },
972
+ ],
973
+ },
974
+ ],
975
+ },
976
+ {
977
+ value: '福建',
978
+ text: '福建',
979
+ children: [
980
+ {
981
+ value: '福州',
982
+ text: '福州',
983
+ children: [
984
+ { value: '鼓楼区', text: '鼓楼区' },
985
+ { value: '台江区', text: '台江区' },
986
+ ],
987
+ },
988
+ ],
989
+ },
990
+ ])
991
+ const change6 = (value: any, path: any) => {
992
+ console.log('onChange', value, path)
993
+ setValue6(value)
994
+ }
995
+ const onPathChange = (value: any, path: any) => {
996
+ console.log('onPathChange', value, path)
997
+ }
998
+
999
+ return (
1000
+ <>
1001
+ <Cell
1002
+ title="选择地址"
1003
+ extra={
1004
+ <div style={{ color: value6.length ? 'rgba(0,0,0,0.95)' : 'rgba(0,0,0,0.4)' }}>
1005
+ {value6.length ? value6.join(' ') : '请选择地址'}
1006
+ </div>
1007
+ }
1008
+ onClick={() => {
1009
+ setIsVisibleDemo6(true)
1010
+ }}
1011
+ />
1012
+ <ConfigProvider theme={customTheme}>
1013
+ <Cascader
1014
+ visible={isVisibleDemo6}
1015
+ activeColor="#3768FA"
1016
+ defaultValue={value6}
1017
+ title="选择地址"
1018
+ options={optionsDemo6}
1019
+ closeable
1020
+ activeIcon="star"
1021
+ onClose={() => {
1022
+ setIsVisibleDemo6(false)
1023
+ }}
1024
+ onChange={change6}
1025
+ onPathChange={onPathChange}
1026
+ />{' '}
1027
+ </ConfigProvider>
1028
+ </>
1029
+ )
1030
+ }
1031
+ export default Demo6
1032
+
1033
+ ```
1034
+
1035
+ ## Cascader
1036
+
1037
+ ### Props
1038
+
1039
+ | 属性 | 说明 | 类型 | 默认值 |
1040
+ | --- | --- | --- | --- |
1041
+ | value | 选中值,受控 | `(number \| string)[]` | `-` |
1042
+ | defaultValue | 默认选中值 | `(number \| string)[]` | `-` |
1043
+ | options | 级联数据 | `Array` | `-` |
1044
+ | popup | 是否弹窗状态展示 | `boolean` | `true` |
1045
+ | visible | 级联显示隐藏状态 | `boolean` | `false` |
1046
+ | activeColor | 选中激活颜色 | `string` | `-` |
1047
+ | activeIcon | 标记选中的Icon | `string` | `ReactNode` |
1048
+ | lazy | 是否开启动态加载 | `boolean` | `false` |
1049
+ | optionKey | 自定义`options`中的关键字,valueKey、textKey、childrenKey | `object` | `{valueKey: 'value', textKey: 'text', childrenKey: 'children'}` |
1050
+ | format | 当options为可转换为树形结构的扁平结构时,配置转换规则 | `Object` | `-` |
1051
+ | title | 标题 | `string` | `-` |
1052
+ | closeIconPosition | 取消按钮位置,继承 Popup 组件 | `string` | `top-right` |
1053
+ | closeIcon | 自定义关闭按钮,继承 Popup 组件 | `ReactNode` | `-` |
1054
+ | closeable | 是否显示关闭按钮,继承 Popup 组件 | `boolean` | `true` |
1055
+ | onLoad | 动态加载回调,开启动态加载时生效 | `(node: any, resolve: any) => void` | `-` |
1056
+ | onChange | 选中值改变时触发 | `(value: CascaderValue, params?: any) => void` | `-` |
1057
+ | onPathChange | 选中项改变时触发 | `(value: CascaderValue, params: any) => void` | `-` |
1058
+ ### Ref
1059
+
1060
+ | 事件名 | 说明 | 回调参数 |
1061
+ |------| --- | --- |
1062
+ | open | 显示 Cascader | `() => void` |
1063
+ | close | 关闭 Cascader | `() => void` |
1064
+ ## 主题定制
1065
+
1066
+ ### 样式变量
1067
+
1068
+ 组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider 组件](#/zh-CN/component/configprovider)。
1069
+
1070
+ | 名称 | 说明 | 默认值 |
1071
+ | --- | --- | --- |
1072
+ | \--nutui-cascader-font-size | 级联总字号 | `$font-size-2` |
1073
+ | \--nutui-cascader-pane-height | 级联面板高度 | `342px` |
1074
+ | \--nutui-cascader-tabs-item-padding | 级联tabs的标题部分的padding 值 | `0 12px` |
1075
+ | \--nutui-cascader-item-padding | 级联数据每一条的padding值 | `12px 16px` |
1076
+ | \--nutui-cascader-item-margin | 级联数据每一条的margin值 | `0px` |
1077
+ | \--nutui-cascader-item-border-bottom | 级联数据每一条的底部边框 | `0px solid $color-border` |
1078
+ | \--nutui-cascader-item-color | 级联数据每一条的色值 | `$color-title` |
1079
+ | \--nutui-cascader-item-font-size | 级联数据每一条的字号 | `$font-size-2` |
1080
+ | \--nutui-cascader-item-active-color | 级联数据每一条的选中色值 | `$color-primary` |