@fjyueke/bify-mcp 1.0.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 (210) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +34 -0
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +248 -0
  5. package/metaData/components/action-sheet/api.md +74 -0
  6. package/metaData/components/action-sheet/doc.md +243 -0
  7. package/metaData/components/action-sheet/example/index.tsx +116 -0
  8. package/metaData/components/area-picker/api.md +25 -0
  9. package/metaData/components/area-picker/doc.md +132 -0
  10. package/metaData/components/area-picker/example/index.tsx +60 -0
  11. package/metaData/components/avatar/api.md +19 -0
  12. package/metaData/components/avatar/doc.md +170 -0
  13. package/metaData/components/avatar/example/index.tsx +76 -0
  14. package/metaData/components/back-top/api.md +21 -0
  15. package/metaData/components/back-top/doc.md +142 -0
  16. package/metaData/components/back-top/example/index.tsx +96 -0
  17. package/metaData/components/backdrop/api.md +20 -0
  18. package/metaData/components/backdrop/doc.md +98 -0
  19. package/metaData/components/backdrop/example/index.tsx +33 -0
  20. package/metaData/components/badge/api.md +10 -0
  21. package/metaData/components/badge/doc.md +169 -0
  22. package/metaData/components/badge/example/index.tsx +81 -0
  23. package/metaData/components/button/api.md +31 -0
  24. package/metaData/components/button/doc.md +235 -0
  25. package/metaData/components/button/example/index.tsx +235 -0
  26. package/metaData/components/calendar/api.md +62 -0
  27. package/metaData/components/calendar/doc.md +516 -0
  28. package/metaData/components/calendar/example/index.tsx +501 -0
  29. package/metaData/components/cascader/api.md +55 -0
  30. package/metaData/components/cascader/doc.md +358 -0
  31. package/metaData/components/cascader/example/index.tsx +159 -0
  32. package/metaData/components/cell/api.md +37 -0
  33. package/metaData/components/cell/doc.md +158 -0
  34. package/metaData/components/cell/example/index.tsx +44 -0
  35. package/metaData/components/checkbox/api.md +35 -0
  36. package/metaData/components/checkbox/doc.md +203 -0
  37. package/metaData/components/checkbox/example/index.tsx +94 -0
  38. package/metaData/components/circle/api.md +17 -0
  39. package/metaData/components/circle/doc.md +123 -0
  40. package/metaData/components/circle/example/index.tsx +81 -0
  41. package/metaData/components/collapse/api.md +31 -0
  42. package/metaData/components/collapse/doc.md +142 -0
  43. package/metaData/components/collapse/example/index.tsx +81 -0
  44. package/metaData/components/config-provider/api.md +7 -0
  45. package/metaData/components/config-provider/doc.md +193 -0
  46. package/metaData/components/config-provider/example/index.tsx +54 -0
  47. package/metaData/components/countdown/api.md +46 -0
  48. package/metaData/components/countdown/doc.md +167 -0
  49. package/metaData/components/countdown/example/index.tsx +70 -0
  50. package/metaData/components/datetime-picker/api.md +25 -0
  51. package/metaData/components/datetime-picker/doc.md +317 -0
  52. package/metaData/components/datetime-picker/example/index.tsx +265 -0
  53. package/metaData/components/dialog/api.md +66 -0
  54. package/metaData/components/dialog/doc.md +292 -0
  55. package/metaData/components/dialog/example/index.tsx +138 -0
  56. package/metaData/components/divider/api.md +15 -0
  57. package/metaData/components/divider/doc.md +108 -0
  58. package/metaData/components/divider/example/index.tsx +45 -0
  59. package/metaData/components/dropdown-menu/api.md +37 -0
  60. package/metaData/components/dropdown-menu/doc.md +279 -0
  61. package/metaData/components/dropdown-menu/example/index.tsx +182 -0
  62. package/metaData/components/empty/api.md +20 -0
  63. package/metaData/components/empty/doc.md +126 -0
  64. package/metaData/components/empty/example/index.tsx +66 -0
  65. package/metaData/components/field/api.md +10 -0
  66. package/metaData/components/field/doc.md +274 -0
  67. package/metaData/components/field/example/index.tsx +203 -0
  68. package/metaData/components/fixed-nav/api.md +21 -0
  69. package/metaData/components/fixed-nav/doc.md +196 -0
  70. package/metaData/components/fixed-nav/example/index.tsx +80 -0
  71. package/metaData/components/fixed-view/api.md +10 -0
  72. package/metaData/components/fixed-view/doc.md +25 -0
  73. package/metaData/components/fixed-view/example/index.tsx +12 -0
  74. package/metaData/components/flex/api.md +18 -0
  75. package/metaData/components/flex/doc.md +103 -0
  76. package/metaData/components/flex/example/index.tsx +58 -0
  77. package/metaData/components/floating-bubble/api.md +18 -0
  78. package/metaData/components/floating-bubble/doc.md +94 -0
  79. package/metaData/components/floating-bubble/example/index.tsx +55 -0
  80. package/metaData/components/floating-panel/api.md +19 -0
  81. package/metaData/components/floating-panel/doc.md +174 -0
  82. package/metaData/components/floating-panel/example/index.tsx +131 -0
  83. package/metaData/components/form/api.md +124 -0
  84. package/metaData/components/form/doc.md +759 -0
  85. package/metaData/components/form/example/index.tsx +222 -0
  86. package/metaData/components/grid/api.md +28 -0
  87. package/metaData/components/grid/doc.md +167 -0
  88. package/metaData/components/grid/example/index.tsx +80 -0
  89. package/metaData/components/image/api.md +42 -0
  90. package/metaData/components/image/doc.md +117 -0
  91. package/metaData/components/image/example/index.tsx +76 -0
  92. package/metaData/components/index-list/api.md +39 -0
  93. package/metaData/components/index-list/doc.md +176 -0
  94. package/metaData/components/index-list/example/index.tsx +110 -0
  95. package/metaData/components/list/api.md +30 -0
  96. package/metaData/components/list/doc.md +317 -0
  97. package/metaData/components/list/example/index.tsx +218 -0
  98. package/metaData/components/loading/api.md +10 -0
  99. package/metaData/components/loading/doc.md +113 -0
  100. package/metaData/components/loading/example/index.tsx +47 -0
  101. package/metaData/components/navbar/api.md +26 -0
  102. package/metaData/components/navbar/doc.md +85 -0
  103. package/metaData/components/navbar/example/index.tsx +28 -0
  104. package/metaData/components/notice-bar/api.md +28 -0
  105. package/metaData/components/notice-bar/doc.md +154 -0
  106. package/metaData/components/notice-bar/example/index.tsx +107 -0
  107. package/metaData/components/notify/api.md +28 -0
  108. package/metaData/components/notify/doc.md +140 -0
  109. package/metaData/components/notify/example/index.tsx +89 -0
  110. package/metaData/components/number-keyboard/api.md +21 -0
  111. package/metaData/components/number-keyboard/doc.md +247 -0
  112. package/metaData/components/number-keyboard/example/index.tsx +201 -0
  113. package/metaData/components/pagination/api.md +18 -0
  114. package/metaData/components/pagination/doc.md +113 -0
  115. package/metaData/components/pagination/example/index.tsx +73 -0
  116. package/metaData/components/password-input/api.md +25 -0
  117. package/metaData/components/password-input/doc.md +126 -0
  118. package/metaData/components/password-input/example/index.tsx +124 -0
  119. package/metaData/components/picker/api.md +61 -0
  120. package/metaData/components/picker/doc.md +336 -0
  121. package/metaData/components/picker/example/index.tsx +232 -0
  122. package/metaData/components/popup/api.md +48 -0
  123. package/metaData/components/popup/doc.md +150 -0
  124. package/metaData/components/popup/example/index.tsx +214 -0
  125. package/metaData/components/progress/api.md +11 -0
  126. package/metaData/components/progress/doc.md +105 -0
  127. package/metaData/components/progress/example/index.tsx +58 -0
  128. package/metaData/components/pull-refresh/api.md +18 -0
  129. package/metaData/components/pull-refresh/doc.md +198 -0
  130. package/metaData/components/pull-refresh/example/index.tsx +153 -0
  131. package/metaData/components/radio/api.md +26 -0
  132. package/metaData/components/radio/doc.md +201 -0
  133. package/metaData/components/radio/example/index.tsx +103 -0
  134. package/metaData/components/rate/api.md +23 -0
  135. package/metaData/components/rate/doc.md +122 -0
  136. package/metaData/components/rate/example/index.tsx +36 -0
  137. package/metaData/components/rolling-text/api.md +23 -0
  138. package/metaData/components/rolling-text/doc.md +153 -0
  139. package/metaData/components/rolling-text/example/index.tsx +150 -0
  140. package/metaData/components/safe-area/api.md +8 -0
  141. package/metaData/components/safe-area/doc.md +30 -0
  142. package/metaData/components/safe-area/example/index.tsx +16 -0
  143. package/metaData/components/search/api.md +35 -0
  144. package/metaData/components/search/doc.md +185 -0
  145. package/metaData/components/search/example/index.tsx +101 -0
  146. package/metaData/components/share-sheet/api.md +48 -0
  147. package/metaData/components/share-sheet/doc.md +215 -0
  148. package/metaData/components/share-sheet/example/index.tsx +143 -0
  149. package/metaData/components/sidebar/api.md +28 -0
  150. package/metaData/components/sidebar/doc.md +122 -0
  151. package/metaData/components/sidebar/example/index.tsx +58 -0
  152. package/metaData/components/signature/api.md +19 -0
  153. package/metaData/components/signature/doc.md +115 -0
  154. package/metaData/components/signature/example/index.tsx +56 -0
  155. package/metaData/components/skeleton/api.md +45 -0
  156. package/metaData/components/skeleton/doc.md +131 -0
  157. package/metaData/components/skeleton/example/index.tsx +80 -0
  158. package/metaData/components/slider/api.md +28 -0
  159. package/metaData/components/slider/doc.md +151 -0
  160. package/metaData/components/slider/example/index.tsx +54 -0
  161. package/metaData/components/space/api.md +12 -0
  162. package/metaData/components/space/doc.md +125 -0
  163. package/metaData/components/space/example/index.tsx +75 -0
  164. package/metaData/components/stepper/api.md +37 -0
  165. package/metaData/components/stepper/doc.md +152 -0
  166. package/metaData/components/stepper/example/index.tsx +45 -0
  167. package/metaData/components/steps/api.md +9 -0
  168. package/metaData/components/steps/doc.md +143 -0
  169. package/metaData/components/steps/example/index.tsx +93 -0
  170. package/metaData/components/sticky/api.md +16 -0
  171. package/metaData/components/sticky/doc.md +87 -0
  172. package/metaData/components/sticky/example/index.tsx +62 -0
  173. package/metaData/components/swipe-cell/api.md +19 -0
  174. package/metaData/components/swipe-cell/doc.md +105 -0
  175. package/metaData/components/swipe-cell/example/index.tsx +62 -0
  176. package/metaData/components/swiper/api.md +22 -0
  177. package/metaData/components/swiper/doc.md +228 -0
  178. package/metaData/components/swiper/example/index.tsx +118 -0
  179. package/metaData/components/switch/api.md +17 -0
  180. package/metaData/components/switch/doc.md +110 -0
  181. package/metaData/components/switch/example/index.tsx +57 -0
  182. package/metaData/components/tabbar/api.md +27 -0
  183. package/metaData/components/tabbar/doc.md +160 -0
  184. package/metaData/components/tabbar/example/index.tsx +99 -0
  185. package/metaData/components/tabs/api.md +36 -0
  186. package/metaData/components/tabs/doc.md +307 -0
  187. package/metaData/components/tabs/example/index.tsx +231 -0
  188. package/metaData/components/tag/api.md +17 -0
  189. package/metaData/components/tag/doc.md +162 -0
  190. package/metaData/components/tag/example/index.tsx +84 -0
  191. package/metaData/components/text-ellipsis/api.md +26 -0
  192. package/metaData/components/text-ellipsis/doc.md +135 -0
  193. package/metaData/components/text-ellipsis/example/index.tsx +44 -0
  194. package/metaData/components/timeline/api.md +20 -0
  195. package/metaData/components/timeline/doc.md +210 -0
  196. package/metaData/components/timeline/example/index.tsx +145 -0
  197. package/metaData/components/toast/api.md +39 -0
  198. package/metaData/components/toast/doc.md +256 -0
  199. package/metaData/components/toast/example/index.tsx +136 -0
  200. package/metaData/components/tree-select/api.md +19 -0
  201. package/metaData/components/tree-select/doc.md +185 -0
  202. package/metaData/components/tree-select/example/index.tsx +112 -0
  203. package/metaData/components/uploader/api.md +32 -0
  204. package/metaData/components/uploader/doc.md +340 -0
  205. package/metaData/components/uploader/example/index.tsx +222 -0
  206. package/metaData/components/watermark/api.md +18 -0
  207. package/metaData/components/watermark/doc.md +97 -0
  208. package/metaData/components/watermark/example/index.tsx +62 -0
  209. package/metaData/components-index.json +274 -0
  210. package/package.json +56 -0
@@ -0,0 +1,358 @@
1
+ # Cascader 级联选择
2
+
3
+ ### 介绍
4
+
5
+ 级联选择框,用于多层级数据的选择,典型场景为省市区选择。
6
+
7
+ ### 引入
8
+
9
+ ```tsx
10
+ import { Cascader } from "@fjyueke/bify-core"
11
+ ```
12
+
13
+ ## 代码演示
14
+
15
+ ### 基础用法
16
+
17
+ 级联选择组件可以搭配 Field 和 Popup 组件使用,示例如下:
18
+
19
+ ```tsx
20
+ import { Cascader, Field, Popup } from "@fjyueke/bify-core"
21
+ import { ArrowRight } from "@fjyueke/bify-icons"
22
+ import { useState } from "react"
23
+
24
+ const dept = [
25
+ {
26
+ label: "研发中心",
27
+ value: "1",
28
+ children: [
29
+ {
30
+ label: "产线1",
31
+ value: "1-1",
32
+ children: [
33
+ {
34
+ label: "研发",
35
+ value: "1-1-1",
36
+ },
37
+ {
38
+ label: "测试",
39
+ value: "1-1-2",
40
+ },
41
+ {
42
+ label: "产品",
43
+ value: "1-1-3",
44
+ },
45
+ ],
46
+ },
47
+ {
48
+ label: "产线2",
49
+ value: "1-2",
50
+ },
51
+ ],
52
+ },
53
+ {
54
+ label: "客户中心",
55
+ value: "2",
56
+ children: [
57
+ {
58
+ label: "客服",
59
+ value: "2-1",
60
+ },
61
+ {
62
+ label: "销售",
63
+ value: "2-2",
64
+ },
65
+ ],
66
+ },
67
+ ]
68
+
69
+ function BasicCascader() {
70
+ const [open, setOpen] = useState(false)
71
+ const [value, setValue] = useState<string[]>([])
72
+ const [fieldValue, setFieldValue] = useState("")
73
+ return (
74
+ <>
75
+ <Field label="选项值" isLink onClick={() => setOpen(true)}>
76
+ <Input readonly placeholder="请选择部门" value={fieldValue} />
77
+ </Field>
78
+ <Popup open={open} rounded placement="bottom" onClose={setOpen}>
79
+ <Popup.Close />
80
+ <Cascader
81
+ options={dept}
82
+ value={value}
83
+ title="请选择部门"
84
+ placeholder="请选择"
85
+ onSelect={setValue}
86
+ onChange={(_values_, options) => {
87
+ setOpen(false)
88
+ setFieldValue(options.map((item) => item.children).join("/"))
89
+ }}
90
+ />
91
+ </Popup>
92
+ </>
93
+ )
94
+ }
95
+ ```
96
+
97
+ ### 自定义颜色
98
+
99
+ 通过 CSS 变量来设置选中状态的高亮颜色。
100
+
101
+ ```tsx
102
+ <Cascader className="custom-color" />
103
+ ```
104
+
105
+ ```scss
106
+ .custom-color {
107
+ --tabs-active-color: red;
108
+ --cascader-active-color: red;
109
+ }
110
+ ```
111
+
112
+ ### 异步加载选项
113
+
114
+ 通过 loadData 返回下一级的选项,返回空数组[]时结束触发 onChange
115
+
116
+ ```tsx
117
+ export const dynamic = [
118
+ {
119
+ label: "产品",
120
+ value: "1",
121
+ },
122
+ {
123
+ label: "测试",
124
+ value: "2",
125
+ },
126
+ {
127
+ label: "研发",
128
+ value: "3",
129
+ },
130
+ ]
131
+
132
+ function DynamicCascader() {
133
+ const [open, setOpen] = useState(false)
134
+ const [value, setValue] = useState<string[]>([])
135
+ const [fieldValue, setFieldValue] = useState("")
136
+ return (
137
+ <>
138
+ <Field label="选项值" isLink onClick={() => setOpen(true)}>
139
+ <Input readonly placeholder="请选择" value={fieldValue} />
140
+ </Field>
141
+ <Popup open={open} rounded placement="bottom" onClose={setOpen}>
142
+ <Popup.Close />
143
+ <Cascader
144
+ options={dynamic}
145
+ loadData={(_values_) => {
146
+ const len = _values_.length
147
+ return new Promise((resolve) => {
148
+ resolve(
149
+ len > 3
150
+ ? []
151
+ : [
152
+ { label: `动态${len}-1`, value: Math.random() },
153
+ { label: `动态${len}-2`, value: Math.random() },
154
+ ],
155
+ )
156
+ })
157
+ }}
158
+ title="请选择"
159
+ swipeable
160
+ value={value}
161
+ onSelect={setValue}
162
+ onChange={(_values_, options) => {
163
+ setOpen(false)
164
+ setFieldValue(options.map((item) => item.children).join("/"))
165
+ }}
166
+ />
167
+ </Popup>
168
+ </>
169
+ )
170
+ }
171
+ ```
172
+
173
+ > Tips: 数据量大时,可关闭 animated,swipeable,避免卡顿
174
+
175
+ ### 自定义字段名
176
+
177
+ ```tsx
178
+ const fieldNames = {
179
+ label: "name",
180
+ value: "code",
181
+ children: "data",
182
+ }
183
+ function CustomFieldCascader() {
184
+ const [open, setOpen] = useState(false)
185
+ const [value, setValue] = useState<string[]>([])
186
+ const [fieldValue, setFieldValue] = useState("")
187
+ return (
188
+ <>
189
+ <Field label="选项值" isLink onClick={() => setOpen(true)}>
190
+ <Input readonly placeholder="请选择地区" value={fieldValue} />
191
+ </Field>
192
+ <Popup open={open} rounded placement="bottom" onClose={setOpen}>
193
+ <Popup.Close />
194
+ <Cascader
195
+ options={customArea}
196
+ fieldNames={fieldNames}
197
+ value={value}
198
+ title="请选择地区"
199
+ placeholder="请选择"
200
+ onSelect={setValue}
201
+ onChange={(_values_, options) => {
202
+ setOpen(false)
203
+ setFieldValue(options.map((item) => item.children).join("/"))
204
+ }}
205
+ />
206
+ </Popup>
207
+ </>
208
+ )
209
+ }
210
+ ```
211
+
212
+ ### 手动控制 DOM
213
+
214
+ 可以通过 `Cascader.Header`, `Cascader.Tab`, `Cascader.Option`,配合 `useCascader` 自己控制 DOM
215
+
216
+ ```tsx
217
+ import { Cascader, Field, Popup } from "@fjyueke/bify-core"
218
+ import { ArrowRight } from "@fjyueke/bify-icons"
219
+ import { useState } from "react"
220
+ import { useCascader } from "@fjyueke/bify-hooks"
221
+
222
+ function BasicCascader() {
223
+ const [open, setOpen] = useState(false)
224
+ const [value, setValue] = useState<string[]>([])
225
+ const [fieldValue, setFieldValue] = useState("")
226
+ const { columns } = useCascader({ value, depth: 3, options: area })
227
+ return (
228
+ <>
229
+ <Field label="选项值" isLink onClick={() => setOpen(true)}>
230
+ <Input readonly placeholder="请选择地区" value={fieldValue} />
231
+ </Field>
232
+ <Popup open={open} rounded placement="bottom" onClose={setOpen}>
233
+ <Popup.Close />
234
+ <Cascader
235
+ value={value}
236
+ onSelect={setValue}
237
+ onChange={(_values_, options) => {
238
+ setOpen(false)
239
+ setFieldValue(options.map((item) => item.children).join("/"))
240
+ }}
241
+ >
242
+ <Cascader.Header>请选择所在地区</Cascader.Header>
243
+ {columns.map((options, index) => (
244
+ <Cascader.Tab key={index}>
245
+ {options.map((option) => (
246
+ <Cascader.Option key={option.value} value={option.value}>
247
+ {option.label}
248
+ </Cascader.Option>
249
+ ))}
250
+ </Cascader.Tab>
251
+ ))}
252
+ </Cascader>
253
+ </Popup>
254
+ </>
255
+ )
256
+ }
257
+ ```
258
+
259
+ 通过改变 selected.children,同样可以动态加载选项
260
+
261
+ ```tsx
262
+ const onSelect = (_value) => {
263
+ const level = _value.length - 1
264
+ const selected = columns[level].find((item) => item.value === _value[level])
265
+ if (selected && level < depth - 1) {
266
+ selected.children = [
267
+ { label: `动态${level}-1`, value: Math.random() },
268
+ { label: `动态${level}-2`, value: Math.random() },
269
+ ]
270
+ }
271
+
272
+ setValue(_value)
273
+ }
274
+ ```
275
+
276
+ ## API
277
+
278
+ ### Cascader Props
279
+
280
+ | 参数 | 说明 | 类型 | 默认值 |
281
+ | ----------------------------- | --------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------- |
282
+ | value | 选中项的值 | _string[]_ | - |
283
+ | placeholder | 未选中时的提示文案 | _ReactNode_ | `请选择` |
284
+ | title | 顶部标题 | _ReactNode_ | - |
285
+ | swipeable | 是否开启手势左右滑动切换 | _boolean_ | `false` |
286
+ | animated | 是否开启动过渡动画 | _boolean_ | `true` |
287
+ | options <br>`v0.1.1-alpha.4` | 可选项数据源 | _CascaderDataOption_ | `[]` |
288
+ | loadData <br>`v0.1.1-alpha.4` | 动态加载数据 | _(values: string[], options: CascaderEventOption[]) => Promise<any[]>_ | `_` |
289
+ | fieldNames `v0.1.1-alpha.4` | 自定义 options 结构中的字段 | _CascaderFieldNames_ | `{ label: 'label', value: 'value', children: 'children' }` |
290
+ | ellipsis <br>`v0.5.0-alpha.0` | 是否省略过长的标题文字 | _boolean_ | `true` |
291
+
292
+ ### Cascader Events
293
+
294
+ | 事件 | 说明 | 回调参数 |
295
+ | ---------- | ---------------------- | ----------------------------------------------- |
296
+ | onSelect | 选中项变化时触发 | _values: any[], options: CascaderEventOption[]_ |
297
+ | onChange | 全部选项选择完成后触发 | _values: any[], options: CascaderEventOption[]_ |
298
+ | onTabClick | 点击标签时触发 | _event: Tabs.TabEvent_ |
299
+
300
+ ### Cascader.Header Props
301
+
302
+ | 参数 | 说明 | 类型 | 默认值 |
303
+ | -------- | -------- | ---------- | ------ |
304
+ | children | 头部内容 | _ReactNoe_ | - |
305
+
306
+ ### Cascader.Tab Props
307
+
308
+ | 参数 | 说明 | 类型 | 默认值 |
309
+ | -------- | ---------- | ---------- | ------ |
310
+ | children | 子选项列表 | _ReactNoe_ | - |
311
+
312
+ ### Cascader.Option Props
313
+
314
+ | 参数 | 说明 | 类型 | 默认值 |
315
+ | -------- | -------------------- | ------------------ | ------- |
316
+ | children | 选项内容(必填) | _ReactNoe_ | - |
317
+ | value | 选项对应的值(必填) | _string \| number_ | - |
318
+ | disabled | 是否禁用选项 | _boolean_ | `false` |
319
+
320
+ ### 类型定义
321
+
322
+ 通过`@fjyueke/bify-core/cascader`导入类型
323
+
324
+ ```tsx
325
+ import type {
326
+ CascaderDataOption,
327
+ CascaderEventOption,
328
+ CascaderFieldNames,
329
+ } from "@fjyueke/bify-core/cascader"
330
+ ```
331
+
332
+ ## 主题定制
333
+
334
+ ### 样式变量
335
+
336
+ 组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider](/components/config-provider/) 组件。
337
+
338
+ | 名称 | 默认值 | 描述 |
339
+ | ----------------------------------------- | ------------------------------- | ---- |
340
+ | --cascader-active-color | _var(--blue, $blue)_ | - |
341
+ | --cascader-header-height | _48px \* $hd_ | - |
342
+ | --cascader-header-padding | _0 var(--padding-md)_ | - |
343
+ | --cascader-header-font-size | _var(--font-size-lg)_ | - |
344
+ | --cascader-header-font-weight | _var(--font-weight-bold)_ | - |
345
+ | --cascader-header-line-height | _20px \* $hd_ | - |
346
+ | --cascader-tabs-height | _48px \* $hd_ | - |
347
+ | --cascader-tab-font-weight | _var(--font-weight-bold)_ | - |
348
+ | --cascader-tab-color | _var(--text-color)_ | - |
349
+ | --cascader-inactive-tab-color | _var(--gray-6)_ | - |
350
+ | --cascader-options-height | _384px \* $hd_ | - |
351
+ | --cascader-option-padding | _10px \* $hd var(--padding-md)_ | - |
352
+ | --cascader-option-font-size | _var(--font-size-md)_ | - |
353
+ | --cascader-option-line-height | _var(--line-height-md)_ | - |
354
+ | --cascader-option-active-background-color | _var(--active-color)_ | - |
355
+ | --cascader-disabled-option-color | _var(--gray-5)_ | - |
356
+ | --cascader-active-option-color | _var(--cascader-active-color)_ | - |
357
+ | --cascader-active-option-font-weight | _var(--font-weight-bold)_ | - |
358
+ | --cascader-active-icon-font-size | _18px \* $hd_ | - |
@@ -0,0 +1,159 @@
1
+ import { Cascader, Field, Input, Popup } from "@fjyueke/bify-core"
2
+ import { ArrowRight } from "@fjyueke/bify-icons"
3
+ import { useState } from "react"
4
+ import Block from "../../../components/block"
5
+ import Page from "../../../components/page"
6
+ import { area, dept, customArea, dynamic } from "./area"
7
+ import "./index.scss"
8
+
9
+ function BasicCascader() {
10
+ const [open, setOpen] = useState(false)
11
+ const [value, setValue] = useState<string[]>([])
12
+ const [fieldValue, setFieldValue] = useState("")
13
+ return (
14
+ <>
15
+ <Field label="选项值" isLink onClick={() => setOpen(true)}>
16
+ <Input readonly placeholder="请选择部门" value={fieldValue} />
17
+ </Field>
18
+ <Popup open={open} rounded placement="bottom" onClose={setOpen}>
19
+ <Popup.Close />
20
+ <Cascader
21
+ options={dept}
22
+ value={value}
23
+ title="请选择部门"
24
+ placeholder="请选择"
25
+ onSelect={setValue}
26
+ onChange={(_values_, options) => {
27
+ setOpen(false)
28
+ setFieldValue(
29
+ options.map(item => item.children).join("/")
30
+ )
31
+ }}
32
+ />
33
+ </Popup>
34
+ </>
35
+ )
36
+ }
37
+
38
+ function CustomColorCascader() {
39
+ const [open, setOpen] = useState(false)
40
+ const [value, setValue] = useState<string[]>([])
41
+ const [fieldValue, setFieldValue] = useState("")
42
+ return (
43
+ <>
44
+ <Field label="选项值" isLink onClick={() => setOpen(true)}>
45
+ <Input readonly placeholder="请选择地区" value={fieldValue} />
46
+ </Field>
47
+ <Popup open={open} rounded placement="bottom" onClose={setOpen}>
48
+ <Popup.Close />
49
+ <Cascader
50
+ className="custom-color"
51
+ swipeable
52
+ title="请选择地区"
53
+ options={area}
54
+ value={value}
55
+ onSelect={setValue}
56
+ onChange={(_values_, options) => {
57
+ setOpen(false)
58
+ setFieldValue(
59
+ options.map(item => item.children).join("/")
60
+ )
61
+ }}
62
+ >
63
+ </Cascader>
64
+ </Popup>
65
+ </>
66
+ )
67
+ }
68
+
69
+ function DynamicCascader() {
70
+ const [open, setOpen] = useState(false)
71
+ const [value, setValue] = useState<string[]>([])
72
+ const [fieldValue, setFieldValue] = useState("")
73
+ return (
74
+ <>
75
+ <Field label="选项值" isLink onClick={() => setOpen(true)}>
76
+ <Input readonly placeholder="请选择" value={fieldValue} />
77
+ </Field>
78
+ <Popup open={open} rounded placement="bottom" onClose={setOpen}>
79
+ <Popup.Close />
80
+ <Cascader
81
+ options={dynamic}
82
+ loadData={(_values_) => {
83
+ const len = _values_.length
84
+ return new Promise((resolve) => {
85
+ resolve(len > 3 ? [] : [
86
+ { label: `动态${len}-1`, value: Math.random() },
87
+ { label: `动态${len}-2`, value: Math.random() }
88
+ ])
89
+ })
90
+ }}
91
+ title="请选择"
92
+ swipeable
93
+ value={value}
94
+ onSelect={setValue}
95
+ onChange={(_values_, options) => {
96
+ setOpen(false)
97
+ setFieldValue(
98
+ options.map(item => item.children).join("/")
99
+ )
100
+ }}
101
+ />
102
+ </Popup>
103
+ </>
104
+ )
105
+ }
106
+
107
+ const fieldNames = {
108
+ label: "name",
109
+ value: "code",
110
+ children: "data"
111
+ }
112
+ function CustomFieldCascader() {
113
+ const [open, setOpen] = useState(false)
114
+ const [value, setValue] = useState<string[]>([])
115
+ const [fieldValue, setFieldValue] = useState("")
116
+ return (
117
+ <>
118
+ <Field label="选项值" isLink onClick={() => setOpen(true)}>
119
+ <Input readonly placeholder="请选择地区" value={fieldValue} />
120
+ </Field>
121
+ <Popup open={open} rounded placement="bottom" onClose={setOpen}>
122
+ <Popup.Close />
123
+ <Cascader
124
+ options={customArea}
125
+ fieldNames={fieldNames}
126
+ value={value}
127
+ title="请选择地区"
128
+ placeholder="请选择"
129
+ onSelect={setValue}
130
+ onChange={(_values_, options) => {
131
+ setOpen(false)
132
+ setFieldValue(
133
+ options.map(item => item.children).join("/")
134
+ )
135
+ }}
136
+ />
137
+ </Popup>
138
+ </>
139
+ )
140
+ }
141
+
142
+ export default function CascaderDemo() {
143
+ return (
144
+ <Page title="Cascader 级联选择" className="cascader-demo">
145
+ <Block variant="card" title="基础用法">
146
+ <BasicCascader />
147
+ </Block>
148
+ <Block variant="card" title="自定义颜色">
149
+ <CustomColorCascader />
150
+ </Block>
151
+ <Block variant="card" title="异步加载选项">
152
+ <DynamicCascader />
153
+ </Block>
154
+ <Block variant="card" title="自定义字段名">
155
+ <CustomFieldCascader />
156
+ </Block>
157
+ </Page>
158
+ )
159
+ }
@@ -0,0 +1,37 @@
1
+ ## API
2
+
3
+ ### Cell.Group Props
4
+
5
+ | 参数 | 说明 | 类型 | 默认值 |
6
+ | --------- | ---------------------- | --------- | ------- |
7
+ | title | 分组标题 | _string_ | `-` |
8
+ | inset | 是否展示为圆角卡片风格 | _boolean_ | `false` |
9
+ | bordered | 是否显示外边框 | _boolean_ | `true` |
10
+ | clickable | 是否开启点击反馈 | _boolean_ | `false` |
11
+
12
+ ### Cell Props
13
+
14
+ | 参数 | 说明 | 类型 | 默认值 |
15
+ | ----------------------------------- | ------------------------------------------------------- | ------------------ | ------- |
16
+ | title | 左侧标题 | _number \| string_ | - |
17
+ | children | 右侧内容 | _number \| string_ | - |
18
+ | brief | 标题下方的描述信息 | _string_ | - |
19
+ | size | 单元格大小,可选值为 `large` | _string_ | - |
20
+ | icon | 左侧[图标](/components/icon)或[图片](/components/image) | _ReactNode_ | - |
21
+ | rightIcon | 右侧[图标](/components/icon)或[图片](/components/image) | _ReactNode_ | - |
22
+ | bordered | 是否显示内边框 | _boolean_ | `true` |
23
+ | clickable | 是否开启点击反馈 | _boolean_ | `false` |
24
+ | isLink `v0.1.1-alpha.5` | 是否展示右侧箭头并开启点击反馈 | _boolean_ | `false` |
25
+ | arrowDirection `v0.1.1-alpha.5` | 箭头方向,可选值为 `left` `right` `up` `down` | _string_ | `right` |
26
+ | required | 是否显示表单必填星号 | _boolean_ | `false` |
27
+ | align | 对齐方式,可选值为 `start` `center` `end` | _string_ | - |
28
+ | titleStyle `v0.8.0` | 左侧标题额外样式 | _CSSProperties_ | - |
29
+ | titleClass `v0.8.0` | 左侧标题额外类名 | _string_ | - |
30
+ | valueClass `v0.8.0` | 右侧内容额外类名 | _string_ | - |
31
+ | briefClass `v0.8.0` | 标题下方的描述信息额外类名 | _string_ | - |
32
+
33
+ ### Cell Events
34
+
35
+ | 事件名 | 说明 | 回调参数 |
36
+ | ------- | ---------------- | ------------------- |
37
+ | onClick | 点击单元格时触发 | _event: MouseEvent_ |