@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,167 @@
1
+ # Countdown 倒计时
2
+
3
+ ### 介绍
4
+
5
+ 用于实时展示倒计时数值,支持毫秒精度。
6
+
7
+ ### 引入
8
+
9
+ ```tsx
10
+ import { Countdown } from "@fjyueke/bify-core"
11
+ ```
12
+
13
+ ## 代码演示
14
+
15
+ ### 基础用法
16
+
17
+ `value` 属性表示倒计时总时长,单位为毫秒。
18
+
19
+ ```tsx
20
+ <Countdown value={30 * 60 * 60 * 1000} />
21
+ ```
22
+
23
+ ### 自定义格式
24
+
25
+ 通过 `format` 属性设置倒计时文本的内容。
26
+
27
+ ```tsx
28
+ <Countdown value={30 * 60 * 60 * 1000} format="DD 天 HH 时 mm 分 ss 秒" />
29
+ ```
30
+
31
+ ### 毫秒级渲染
32
+
33
+ 倒计时默认每秒渲染一次,设置 `interval` 属性可以开启毫秒级渲染。
34
+
35
+ ```tsx
36
+ <Countdown interval={1} value={30 * 60 * 60 * 1000} format="HH:mm:ss:SS" />
37
+ ```
38
+
39
+ ### 自定义样式
40
+
41
+ 通过 `children` 自定义倒计时的样式,`current` 对象格式见下方表格。
42
+
43
+ ```tsx
44
+ <Countdown value={30 * 60 * 60 * 1000}>
45
+ {(current) => (
46
+ <>
47
+ <View className="block">{current.hours}</View>
48
+ <View className="colon">:</View>
49
+ <View className="block">{current.minutes}</View>
50
+ <View className="colon">:</View>
51
+ <View className="block">{current.seconds}</View>
52
+ </>
53
+ )}
54
+ </Countdown>
55
+ ```
56
+
57
+ ```scss
58
+ .colon {
59
+ display: inline-block;
60
+ margin: 0 4px * 2;
61
+ color: #ee0a24;
62
+ }
63
+
64
+ .block {
65
+ display: inline-block;
66
+ width: 22px * 2;
67
+ color: #fff;
68
+ font-size: 12px * 2;
69
+ text-align: center;
70
+ background-color: #ee0a24;
71
+ border-radius: 4px * 2;
72
+ }
73
+ ```
74
+
75
+ ### 手动控制
76
+
77
+ 通过 useCountdown 获取返回值后,可以调用 `start`、`pause`、`stop`、`restart` 方法。
78
+
79
+ ```tsx
80
+ function CountdownWithManualControl() {
81
+ const countRef = useRef<CountdownInstance>(null)
82
+ return (
83
+ <>
84
+ <Toast id="toast" />
85
+ <Countdown
86
+ className="manual-control"
87
+ ref={countRef}
88
+ value={30 * 1000}
89
+ format="ss:SSS"
90
+ onComplete={() => Toast.open("倒计时结束")}
91
+ />
92
+ <Grid columns={3} clickable>
93
+ <Grid.Item
94
+ icon={<PlayCircleOutlined />}
95
+ text="开始"
96
+ onClick={() => countRef.current?.start()}
97
+ />
98
+ <Grid.Item
99
+ icon={<PauseCircleOutlined />}
100
+ text="暂停"
101
+ onClick={() => countRef.current?.pause()}
102
+ />
103
+ <Grid.Item icon={<Replay />} text="重置" onClick={() => countRef.current?.restart()} />
104
+ </Grid>
105
+ </>
106
+ )
107
+ }
108
+ ```
109
+
110
+ ## API
111
+
112
+ ### Props
113
+
114
+ | 参数 | 说明 | 类型 | 默认值 |
115
+ |------------|--------------|--------------------------------------|------------|
116
+ | value | 倒计时时长,单位毫秒 | _number_ | `0` |
117
+ | format | 时间格式 | _string_ | `HH:mm:ss` |
118
+ | autostart | 是否自动开始倒计时 | _boolean_ | `true` |
119
+ | interval | 倒计时渲染间隔,单位毫秒 | _number_ | `1000` |
120
+ | onChange | 倒计时变化时触发 | _(currentTime: CurrentTime) => void_ | - |
121
+ | onComplete | 倒计时结束时触发 | _() => void_ | - |
122
+
123
+ ### format 格式
124
+
125
+ | 格式 | 说明 |
126
+ |-----|---------|
127
+ | DD | 天数 |
128
+ | HH | 小时 |
129
+ | mm | 分钟 |
130
+ | ss | 秒数 |
131
+ | S | 毫秒(1 位) |
132
+ | SS | 毫秒(2 位) |
133
+ | SSS | 毫秒(3 位) |
134
+
135
+ ### CurrentTime 格式
136
+
137
+ | 名称 | 说明 | 类型 |
138
+ |--------------|-------------|----------|
139
+ | total | 剩余总时间(单位毫秒) | _number_ |
140
+ | days | 剩余天数 | _number_ |
141
+ | hours | 剩余小时 | _number_ |
142
+ | minutes | 剩余分钟 | _number_ |
143
+ | seconds | 剩余秒数 | _number_ |
144
+ | milliseconds | 剩余毫秒 | _number_ |
145
+
146
+ ### 方法
147
+
148
+ 通过 ref 可以获取到 Countdown 实例并调用实例方法。
149
+
150
+ | 方法名 | 说明 | 参数 | 返回值 |
151
+ |---------|------------------------------------------|-----|-----|
152
+ | start | 开始倒计时 | - | - |
153
+ | pause | 暂停倒计时 | - | - |
154
+ | reset | 重设倒计时,若 `autostart` 为 `true`,重设后会自动开始倒计时 | - | - |
155
+ | restart | 重启倒计时 | - | - |
156
+
157
+ ## 主题定制
158
+
159
+ ### 样式变量
160
+
161
+ 组件提供了下列 CSS 变量,可用于自定义样式,使用方法请参考 [ConfigProvider](/components/config-provider/) 组件。
162
+
163
+ | 名称 | 默认值 | 描述 |
164
+ |-------------------------|-------------------------|-----|
165
+ | --countdown-color | _var(--text-color)_ | - |
166
+ | --countdown-font-size | _var(--font-size-md)_ | - |
167
+ | --countdown-line-height | _var(--line-height-md)_ | - |
@@ -0,0 +1,70 @@
1
+ import { Countdown, Grid, Toast } from "@fjyueke/bify-core"
2
+ import { CountdownInstance } from "@fjyueke/bify-core/countdown"
3
+ import { PauseCircleOutlined, PlayCircleOutlined, Replay } from "@fjyueke/bify-icons"
4
+ import { View } from "@tarojs/components"
5
+ import { useRef } from "react"
6
+ import Block from "../../../components/block"
7
+ import Page from "../../../components/page"
8
+ import "./index.scss"
9
+
10
+ function CountdownWithManualControl() {
11
+ const countRef = useRef<CountdownInstance>(null)
12
+ return (
13
+ <>
14
+ <Toast id="toast" />
15
+ <Countdown
16
+ className="manual-control"
17
+ ref={countRef}
18
+ value={30 * 1000}
19
+ interval={1}
20
+ format="ss:SSS"
21
+ onComplete={() => Toast.open("倒计时结束")}
22
+ />
23
+ <Grid columns={3} clickable>
24
+ <Grid.Item
25
+ icon={<PlayCircleOutlined />}
26
+ text="开始"
27
+ onClick={() => countRef.current?.start()}
28
+ />
29
+ <Grid.Item
30
+ icon={<PauseCircleOutlined />}
31
+ text="暂停"
32
+ onClick={() => countRef.current?.pause()}
33
+ />
34
+ <Grid.Item icon={<Replay />} text="重置" onClick={() => countRef.current?.reset()} />
35
+ </Grid>
36
+ </>
37
+ )
38
+ }
39
+
40
+ export default function CountDownDemo() {
41
+ return (
42
+ <Page title="CountDown 倒计时" className="count-down-demo">
43
+ <Block title="基础用法">
44
+ <Countdown value={30 * 60 * 60 * 1000} />
45
+ </Block>
46
+ <Block title="自定义格式">
47
+ <Countdown value={30 * 60 * 60 * 1000} format="DD 天 HH 时 mm 分 ss 秒" />
48
+ </Block>
49
+ <Block title="毫秒级渲染">
50
+ <Countdown interval={1} value={30 * 60 * 60 * 1000} format="HH:mm:ss:SS" />
51
+ </Block>
52
+ <Block title="自定义样式">
53
+ <Countdown value={30 * 60 * 60 * 1000}>
54
+ {(current) => (
55
+ <>
56
+ <View className="block">{current.hours}</View>
57
+ <View className="colon">:</View>
58
+ <View className="block">{current.minutes}</View>
59
+ <View className="colon">:</View>
60
+ <View className="block">{current.seconds}</View>
61
+ </>
62
+ )}
63
+ </Countdown>
64
+ </Block>
65
+ <Block className="manual-control-block" title="手动控制">
66
+ <CountdownWithManualControl />
67
+ </Block>
68
+ </Page>
69
+ )
70
+ }
@@ -0,0 +1,25 @@
1
+ ## API
2
+
3
+ ### Props
4
+
5
+ | 参数 | 说明 | 类型 | 默认值 |
6
+ | ------------ | ------------------------------------------------------------------------------------------------------ | ---------------------------------------------- | ---------- |
7
+ | type | 时间类型,可选值为 `date` `time` <br> `year-month` `month-day` `date-hour` `date-minute` `hour-minute` | _string_ | `datetime` |
8
+ | defaultValue | 默认选中的时间 | _Date_ | - |
9
+ | value | 选中的时间 | _Date_ | - |
10
+ | min | 可选的最小时间,精确到秒 | _Date_ | 十年前 |
11
+ | max | 可选的最大时间,精确到秒 | _Date_ | 十年后 |
12
+ | filter | 选项过滤函数 | _(type: string, values: string[]) => string[]_ | - |
13
+ | formatter | 选项格式化函数 | _(type: string, value: string) => string_ | - |
14
+ | fields | 自定义列排序数组, 子项可选值为<br> `year` `month` `day` `hour` `minute` | _string[]_ | - |
15
+ | loading | 是否显示加载状态 | _boolean_ | `false` |
16
+ | readonly | 是否为只读状态,只读状态下无法切换选项 | _boolean_ | `false` |
17
+ | siblingCount | 可见的选项相邻个数 | _number_ | `3` |
18
+
19
+ ### Events
20
+
21
+ | 事件名 | 说明 | 回调参数 |
22
+ | --------- | ------------------------ | ----------- |
23
+ | onChange | 当值变化时触发的事件 | value: Date |
24
+ | onConfirm | 点击完成按钮时触发的事件 | value: Date |
25
+ | onCancel | 点击取消按钮时触发的事件 | value: Date |
@@ -0,0 +1,317 @@
1
+ # DatetimePicker 时间选择
2
+
3
+ ### 介绍
4
+
5
+ 时间选择器,支持日期、年月、时分秒等维度,通常与[弹出层](/components/popup)组件配合使用。
6
+
7
+ ### 引入
8
+
9
+ ```tsx
10
+ import { DatetimePicker } from "@fjyueke/bify-core"
11
+ ```
12
+
13
+ ## 代码演示
14
+
15
+ ### 选择年月日
16
+
17
+ DatetimePicker 通过 type 属性来定义需要选择的时间类型,type 为 `date` 表示选择年月日。通过 min 和 max 属性可以确定可选的时间范围。
18
+
19
+ ```tsx
20
+ function DatePicker() {
21
+ const [minDate] = useState(new Date(2021, 9, 14))
22
+ const [maxDate] = useState(new Date(2023, 11, 12))
23
+ const [defaultValue] = useState(new Date(2021, 9, 14))
24
+ const [value, setValue] = useState(new Date(2022, 10, 14))
25
+ return (
26
+ <DatetimePicker
27
+ type="date"
28
+ min={minDate}
29
+ max={maxDate}
30
+ defaultValue={defaultValue}
31
+ value={value}
32
+ onChange={setValue}
33
+ >
34
+ <DatetimePicker.Toolbar>
35
+ <DatetimePicker.Button>取消</DatetimePicker.Button>
36
+ <DatetimePicker.Title>选择年月日</DatetimePicker.Title>
37
+ <DatetimePicker.Button>确认</DatetimePicker.Button>
38
+ </DatetimePicker.Toolbar>
39
+ </DatetimePicker>
40
+ )
41
+ }
42
+ ```
43
+
44
+ ### 选择年月
45
+
46
+ 将 type 设置为 `year-month` 即可选择年份和月份。通过传入 `formatter` 函数,可以对选项文字进行格式化处理。
47
+
48
+ ```tsx
49
+ function YearMonthPicker() {
50
+ const [minDate] = useState(new Date(2020, 0, 1))
51
+ const [maxDate] = useState(new Date(2025, 10, 1))
52
+ const [defaultValue] = useState(new Date(2021, 0, 17))
53
+
54
+ return (
55
+ <DatetimePicker
56
+ type="year-month"
57
+ min={minDate}
58
+ max={maxDate}
59
+ defaultValue={defaultValue}
60
+ formatter={(type, val) => {
61
+ if (type === "year") {
62
+ return `${val}年`
63
+ }
64
+ if (type === "month") {
65
+ return `${val}月`
66
+ }
67
+ return val
68
+ }}
69
+ >
70
+ <DatetimePicker.Toolbar>
71
+ <DatetimePicker.Button>取消</DatetimePicker.Button>
72
+ <DatetimePicker.Title>选择年月</DatetimePicker.Title>
73
+ <DatetimePicker.Button>确认</DatetimePicker.Button>
74
+ </DatetimePicker.Toolbar>
75
+ </DatetimePicker>
76
+ )
77
+ }
78
+ ```
79
+
80
+ ### 选择月日
81
+
82
+ 将 type 设置为 `month-day` 即可选择月份和日期。
83
+
84
+ ```tsx
85
+ function MonthDayPicker() {
86
+ const [minDate] = useState(new Date(2020, 0, 1))
87
+ const [maxDate] = useState(new Date(2025, 10, 1))
88
+ const [defaultValue] = useState(new Date(2021, 0, 17))
89
+
90
+ return (
91
+ <DatetimePicker
92
+ type="month-day"
93
+ min={minDate}
94
+ max={maxDate}
95
+ defaultValue={defaultValue}
96
+ formatter={(type, val) => {
97
+ if (type === "month") {
98
+ return `${val}月`
99
+ }
100
+ if (type === "day") {
101
+ return `${val}日`
102
+ }
103
+ return val
104
+ }}
105
+ >
106
+ <DatetimePicker.Toolbar>
107
+ <DatetimePicker.Button>取消</DatetimePicker.Button>
108
+ <DatetimePicker.Title>选择年月</DatetimePicker.Title>
109
+ <DatetimePicker.Button>确认</DatetimePicker.Button>
110
+ </DatetimePicker.Toolbar>
111
+ </DatetimePicker>
112
+ )
113
+ }
114
+ ```
115
+
116
+ ### 选择时间
117
+
118
+ 将 type 设置为 `time` 即可选择时间(时、分、秒)。
119
+
120
+ ```tsx
121
+ function TimePicker() {
122
+ const [minDate] = useState(new Date(2020, 0, 1, 10, 0, 0))
123
+ const [maxDate] = useState(new Date(2020, 0, 1, 20, 59, 59))
124
+ const [defaultValue] = useState(new Date(2020, 0, 1, 12, 0, 0))
125
+
126
+ return (
127
+ <DatetimePicker type="time" min={minDate} max={maxDate} defaultValue={defaultValue}>
128
+ <DatetimePicker.Toolbar>
129
+ <DatetimePicker.Button>取消</DatetimePicker.Button>
130
+ <DatetimePicker.Title>选择时间</DatetimePicker.Title>
131
+ <DatetimePicker.Button>确认</DatetimePicker.Button>
132
+ </DatetimePicker.Toolbar>
133
+ </DatetimePicker>
134
+ )
135
+ }
136
+ ```
137
+
138
+ ### 选择完整时间
139
+
140
+ 将 type 设置为 `datetime` 即可选择完整时间,包括年月日时分秒。
141
+
142
+ ```tsx
143
+ function DateTimePicker() {
144
+ const [minDate] = useState(new Date(2020, 0, 1, 10, 0, 0))
145
+ const [maxDate] = useState(new Date(2025, 10, 1, 20, 59, 59))
146
+ const [defaultValue] = useState(new Date(2021, 2, 3, 12, 12, 12))
147
+
148
+ return (
149
+ <DatetimePicker type="datetime" min={minDate} max={maxDate} defaultValue={defaultValue}>
150
+ <DatetimePicker.Toolbar>
151
+ <DatetimePicker.Button>取消</DatetimePicker.Button>
152
+ <DatetimePicker.Title>选择完整时间</DatetimePicker.Title>
153
+ <DatetimePicker.Button>确认</DatetimePicker.Button>
154
+ </DatetimePicker.Toolbar>
155
+ </DatetimePicker>
156
+ )
157
+ }
158
+ ```
159
+
160
+ ### 选择年月日小时
161
+
162
+ 将 type 设置为 `date-hour` 即可选择日期和小时,包括年月日和小时。
163
+
164
+ ```tsx
165
+ function DateHourPicker() {
166
+ const [minDate] = useState(new Date(2020, 0, 1, 0))
167
+ const [maxDate] = useState(new Date(2025, 10, 1, 23))
168
+ const [defaultValue] = useState(new Date())
169
+
170
+ return (
171
+ <DatetimePicker type="date-hour" min={minDate} max={maxDate} defaultValue={defaultValue}>
172
+ <DatetimePicker.Toolbar>
173
+ <DatetimePicker.Button>取消</DatetimePicker.Button>
174
+ <DatetimePicker.Title>选择年月日小时</DatetimePicker.Title>
175
+ <DatetimePicker.Button>确认</DatetimePicker.Button>
176
+ </DatetimePicker.Toolbar>
177
+ </DatetimePicker>
178
+ )
179
+ }
180
+ ```
181
+
182
+ ### 选择年月日时分
183
+
184
+ 将 type 设置为 `date-minute` 即可选择日期和时分,包括年月日时分。
185
+
186
+ ```tsx
187
+ function DateMinutePicker() {
188
+ const [minDate] = useState(new Date(2020, 0, 1, 0, 0))
189
+ const [maxDate] = useState(new Date(2025, 10, 1, 23, 59))
190
+ const [defaultValue] = useState(new Date())
191
+
192
+ return (
193
+ <DatetimePicker type="date-minute" min={minDate} max={maxDate} defaultValue={defaultValue}>
194
+ <DatetimePicker.Toolbar>
195
+ <DatetimePicker.Button>取消</DatetimePicker.Button>
196
+ <DatetimePicker.Title>选择年月日时分</DatetimePicker.Title>
197
+ <DatetimePicker.Button>确认</DatetimePicker.Button>
198
+ </DatetimePicker.Toolbar>
199
+ </DatetimePicker>
200
+ )
201
+ }
202
+ ```
203
+
204
+ ### 选项过滤器
205
+
206
+ 通过传入 `filter` 函数,可以对选项数组进行过滤,实现自定义时间间隔。
207
+
208
+ ```tsx
209
+ function TimePickerWithFilter() {
210
+ const [minDate] = useState(new Date(2020, 0, 1, 0, 0, 0))
211
+ const [maxDate] = useState(new Date(2020, 0, 1, 23, 59, 59))
212
+ const [defaultValue] = useState(new Date(2020, 0, 1, 12, 0, 0))
213
+
214
+ return (
215
+ <DatetimePicker
216
+ type="time"
217
+ min={minDate}
218
+ max={maxDate}
219
+ defaultValue={defaultValue}
220
+ filter={(type, options) => {
221
+ if (type === "minute") {
222
+ return options.filter((option) => Number(option) % 5 === 0)
223
+ }
224
+ return options
225
+ }}
226
+ >
227
+ <DatetimePicker.Toolbar>
228
+ <DatetimePicker.Button>取消</DatetimePicker.Button>
229
+ <DatetimePicker.Title>选项过滤器</DatetimePicker.Title>
230
+ <DatetimePicker.Button>确认</DatetimePicker.Button>
231
+ </DatetimePicker.Toolbar>
232
+ </DatetimePicker>
233
+ )
234
+ }
235
+ ```
236
+
237
+ ### 自定义列排序
238
+
239
+ ```tsx
240
+ function DatePickerWithFields() {
241
+ const [minDate] = useState(new Date(2020, 0, 1))
242
+ const [maxDate] = useState(new Date(2025, 10, 1))
243
+ const [defaultValue] = useState(new Date(2021, 0, 17))
244
+ return (
245
+ <DatetimePicker
246
+ type="date"
247
+ fields={["month", "day", "year"]}
248
+ defaultValue={defaultValue}
249
+ min={minDate}
250
+ max={maxDate}
251
+ formatter={(type, val) => {
252
+ if (type === "year") {
253
+ return val + "年"
254
+ }
255
+ if (type === "month") {
256
+ return val + "月"
257
+ }
258
+ if (type === "day") {
259
+ return val + "日"
260
+ }
261
+ return val
262
+ }}
263
+ >
264
+ <DatetimePicker.Toolbar>
265
+ <DatetimePicker.Button>取消</DatetimePicker.Button>
266
+ <DatetimePicker.Title>自定义列排序</DatetimePicker.Title>
267
+ <DatetimePicker.Button>确认</DatetimePicker.Button>
268
+ </DatetimePicker.Toolbar>
269
+ </DatetimePicker>
270
+ )
271
+ }
272
+ ```
273
+
274
+ ## API
275
+
276
+ ### Props
277
+
278
+ | 参数 | 说明 | 类型 | 默认值 |
279
+ | ------------ | ------------------------------------------------------------------------------------------------------ | ---------------------------------------------- | ---------- |
280
+ | type | 时间类型,可选值为 `date` `time` <br> `year-month` `month-day` `date-hour` `date-minute` `hour-minute` | _string_ | `datetime` |
281
+ | defaultValue | 默认选中的时间 | _Date_ | - |
282
+ | value | 选中的时间 | _Date_ | - |
283
+ | min | 可选的最小时间,精确到秒 | _Date_ | 十年前 |
284
+ | max | 可选的最大时间,精确到秒 | _Date_ | 十年后 |
285
+ | filter | 选项过滤函数 | _(type: string, values: string[]) => string[]_ | - |
286
+ | formatter | 选项格式化函数 | _(type: string, value: string) => string_ | - |
287
+ | fields | 自定义列排序数组, 子项可选值为<br> `year` `month` `day` `hour` `minute` | _string[]_ | - |
288
+ | loading | 是否显示加载状态 | _boolean_ | `false` |
289
+ | readonly | 是否为只读状态,只读状态下无法切换选项 | _boolean_ | `false` |
290
+ | siblingCount | 可见的选项相邻个数 | _number_ | `3` |
291
+
292
+ ### Events
293
+
294
+ | 事件名 | 说明 | 回调参数 |
295
+ | --------- | ------------------------ | ----------- |
296
+ | onChange | 当值变化时触发的事件 | value: Date |
297
+ | onConfirm | 点击完成按钮时触发的事件 | value: Date |
298
+ | onCancel | 点击取消按钮时触发的事件 | value: Date |
299
+
300
+ ## 常见问题
301
+
302
+ ### 设置 min 或 max 后出现页面卡死的情况?
303
+
304
+ 请注意不要在模板中直接使用类似`min="new Date()"`的写法,这样会导致每次渲染组件时传入一个新的 Date 对象,而传入新的数据会触发下一次渲染,从而陷入死循环。
305
+
306
+ 正确的做法是将`date`作为一个数据定义在`useState`或者`useRef`函数中。
307
+
308
+ ### 在 iOS 系统上初始化组件失败?
309
+
310
+ 如果你遇到了在 iOS 上无法渲染组件的问题,请确认在创建 Date 对象时没有使用`new Date('2020-01-01')`这样的写法,iOS 不支持以中划线分隔的日期格式,正确写法是`new Date('2020/01/01')`
311
+
312
+
313
+ 对此问题的详细解释:[stackoverflow](https://stackoverflow.com/questions/13363673/javascript-date-is-invalid-on-ios)。
314
+
315
+ ### 是否有年份或月份选择器?
316
+
317
+ 如果仅需要选择年份或者月份,建议直接使用 [Picker](/components/picker) 组件。