@gmfe/react 2.14.30-alpha.0 → 2.14.31

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 (72) hide show
  1. package/README.md +295 -0
  2. package/package.json +4 -4
  3. package/src/component/affix/README.md +54 -0
  4. package/src/component/box/README.md +142 -0
  5. package/src/component/box/box_table.js +11 -18
  6. package/src/component/button/README.md +90 -0
  7. package/src/component/calendar/README.md +98 -0
  8. package/src/component/carousel/README.md +51 -0
  9. package/src/component/cascader/README.md +139 -0
  10. package/src/component/checkbox/README.md +120 -0
  11. package/src/component/collapse/README.md +80 -0
  12. package/src/component/color_picker/README.md +50 -0
  13. package/src/component/date_picker/README.md +144 -0
  14. package/src/component/date_range_picker/README.md +126 -0
  15. package/src/component/dialog/README.md +149 -0
  16. package/src/component/divider/README.md +41 -0
  17. package/src/component/drawer/README.md +83 -0
  18. package/src/component/drop_down/README.md +105 -0
  19. package/src/component/drop_select/README.md +146 -0
  20. package/src/component/dropper/README.md +55 -0
  21. package/src/component/editable_text/README.md +68 -0
  22. package/src/component/filter_select/README.md +104 -0
  23. package/src/component/flex/README.md +88 -0
  24. package/src/component/flip_number/README.md +53 -0
  25. package/src/component/form/README.md +199 -0
  26. package/src/component/function_set/README.md +93 -0
  27. package/src/component/grid/README.md +93 -0
  28. package/src/component/icon_down_up/README.md +43 -0
  29. package/src/component/image_preview/README.md +57 -0
  30. package/src/component/img_uploader/README.md +91 -0
  31. package/src/component/input/README.md +49 -0
  32. package/src/component/input_number/README.md +93 -0
  33. package/src/component/layout_root/README.md +181 -0
  34. package/src/component/lazy_img/README.md +59 -0
  35. package/src/component/level_list/README.md +75 -0
  36. package/src/component/level_select/README.md +78 -0
  37. package/src/component/list/README.md +96 -0
  38. package/src/component/loading/README.md +116 -0
  39. package/src/component/mask/README.md +62 -0
  40. package/src/component/modal/README.md +155 -0
  41. package/src/component/more_select/README.md +185 -0
  42. package/src/component/nav/README.md +101 -0
  43. package/src/component/nprogress/README.md +135 -0
  44. package/src/component/pagination/README.md +87 -0
  45. package/src/component/picture_preview/README.md +50 -0
  46. package/src/component/popover/README.md +146 -0
  47. package/src/component/popup/README.md +121 -0
  48. package/src/component/price/README.md +72 -0
  49. package/src/component/progress/README.md +98 -0
  50. package/src/component/progress_circle/README.md +92 -0
  51. package/src/component/radio/README.md +101 -0
  52. package/src/component/recommend_input/README.md +75 -0
  53. package/src/component/select/README.md +120 -0
  54. package/src/component/selection/README.md +87 -0
  55. package/src/component/sheet/README.md +176 -0
  56. package/src/component/steps/README.md +55 -0
  57. package/src/component/storage/README.md +83 -0
  58. package/src/component/switch/README.md +85 -0
  59. package/src/component/table_select/README.md +92 -0
  60. package/src/component/tabs/README.md +85 -0
  61. package/src/component/time_span/README.md +112 -0
  62. package/src/component/tip/README.md +105 -0
  63. package/src/component/tool_tip/README.md +84 -0
  64. package/src/component/transfer/README.md +98 -0
  65. package/src/component/transfer_v2/README.md +85 -0
  66. package/src/component/tree/README.md +99 -0
  67. package/src/component/tree/index.js +1 -1
  68. package/src/component/tree_v2/README.md +99 -0
  69. package/src/component/uploader/README.md +104 -0
  70. package/src/index.js +1 -3
  71. package/LICENSE +0 -16
  72. package/src/hoc/sticky_layout.js +0 -157
@@ -0,0 +1,176 @@
1
+ # Sheet
2
+
3
+ ## 简介
4
+ 数据表格组件 - 用于展示结构化数据,支持列定义、操作列、选择框、批量操作、展开行和分页等功能。(已废弃,建议使用 Table 组件替代)
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import { Sheet, SheetColumn, SheetAction, SheetSelect, SheetBatchAction } from '@gmfe/react/lib/sheet'
12
+
13
+ <Sheet list={dataList}>
14
+ <SheetColumn field='id' name='ID' />
15
+ <SheetColumn field='name' name='名字' />
16
+ <SheetColumn field='age' name='年龄' />
17
+ <SheetAction>
18
+ {(record, index) => <Button>操作</Button>}
19
+ </SheetAction>
20
+ </Sheet>
21
+ ```
22
+
23
+ ## API
24
+
25
+ ### Sheet Props
26
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
27
+ |------|------|------|--------|------|
28
+ | list | 表格数据数组 | `array` | `[]` | 是 |
29
+ | loading | 是否显示加载状态 | `bool` | `false` | 否 |
30
+ | enableEmptyTip | 数据为空时的提示,传入 `true` 显示默认提示,也可传入字符串或 React 元素自定义提示 | `bool \| string \| ReactElement` | - | 否 |
31
+ | className | 自定义类名 | `string` | - | 否 |
32
+ | getTrProps | 获取行属性,返回值会传递到 `<tr>` 上 | `(index: number) => object` | `() => ({})` | 否 |
33
+ | scrollX | 是否开启横向滚动 | `bool` | `false` | 否 |
34
+ | expandedRowRender | 展开行渲染函数 | `(index: number) => ReactElement` | - | 否 |
35
+ | onExpand | 单行展开/收起回调 | `(index: number) => void` | - | 否 |
36
+ | onExpandAll | 全部展开/收起回调 | `() => void` | - | 否 |
37
+ | children | 子组件(SheetColumn、SheetAction、SheetSelect、SheetBatchAction、Pagination 等) | `any` | - | 否 |
38
+
39
+ ### SheetColumn Props
40
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
41
+ |------|------|------|--------|------|
42
+ | field | 对应 list 中的字段名 | `string` | - | 是 |
43
+ | name | 列标题,支持字符串或 React 元素 | `string \| ReactElement` | - | 是 |
44
+ | render | 自定义单元格渲染函数 | `(value: any, index: number, record: object) => ReactNode` | - | 否 |
45
+ | placeholder | 字段值为空时的占位内容 | `any` | - | 否 |
46
+ | children | 自定义单元格渲染(函数子组件),参数为 `(value, index, record)` | `(value, index, record) => ReactNode` | - | 否 |
47
+
48
+ ### SheetAction Props
49
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
50
+ |------|------|------|--------|------|
51
+ | children | 操作列渲染函数,参数为 `(record, index)` | `(record, index) => ReactNode` | - | 否 |
52
+
53
+ ### SheetSelect Props
54
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
55
+ |------|------|------|--------|------|
56
+ | onSelect | 单选回调 | `(checked: bool, index: number) => void` | - | 是 |
57
+ | onSelectAll | 全选回调 | `(checked: bool) => void` | - | 否 |
58
+ | onChange | 选中状态变更回调,参数为完整的 list(修改后的) | `(list: array) => void` | - | 否 |
59
+ | isDisabled | 判断行是否禁用选择 | `(record: object) => bool` | `() => false` | 否 |
60
+ | isRadio | 是否为单选模式 | `bool` | `false` | 否 |
61
+ | hasSelectTip | 是否显示全选提示 | `bool` | `false` | 否 |
62
+ | selectAllTip | 全选提示内容 | `ReactNode` | `'已选中所有'` | 否 |
63
+ | children | 子元素 | `any` | - | 否 |
64
+
65
+ ### SheetBatchAction Props
66
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
67
+ |------|------|------|--------|------|
68
+ | children | 批量操作按钮区域 | `any` | - | 否 |
69
+
70
+ ### Sheet 静态方法
71
+
72
+ #### `Sheet.findTableDOM(ref)`
73
+ 获取表格 DOM 元素。
74
+
75
+ | 参数 | 说明 | 类型 | 必填 |
76
+ |------|------|------|------|
77
+ | ref | Sheet 组件的 ref | `ReactRef` | 是 |
78
+
79
+ 返回值:`HTMLTableElement`
80
+
81
+ ## 示例
82
+
83
+ ### 基础用法
84
+ ```jsx
85
+ <Sheet list={[
86
+ { id: 1, name: '小明', age: '10' },
87
+ { id: 2, name: '小红', age: '15' },
88
+ { id: 3, name: '小蓝', age: '20' }
89
+ ]}>
90
+ <SheetColumn field='id' name='ID' />
91
+ <SheetColumn field='name' name='名字' />
92
+ <SheetColumn field='age' name='年龄' />
93
+ </Sheet>
94
+ ```
95
+
96
+ ### 自定义列渲染
97
+ ```jsx
98
+ <Sheet list={list}>
99
+ <SheetColumn field='id' name='ID' />
100
+ <SheetColumn field='name' name='名字'>
101
+ {(name, index, record) => `我的名字叫${name}, ID是${record.id}`}
102
+ </SheetColumn>
103
+ <SheetColumn field='name' name='名字' render={(name, index, record) => `自定义: ${name}`} />
104
+ </Sheet>
105
+ ```
106
+
107
+ ### 带操作列
108
+ ```jsx
109
+ <Sheet list={list}>
110
+ <SheetColumn field='name' name='名字' />
111
+ <SheetAction>
112
+ {(record, index) => (
113
+ <div>
114
+ <Button onClick={() => alert(record.name)}>删除</Button>
115
+ </div>
116
+ )}
117
+ </SheetAction>
118
+ </Sheet>
119
+ ```
120
+
121
+ ### 带选择框
122
+ ```jsx
123
+ <Sheet list={list}>
124
+ <SheetColumn field='name' name='名字' />
125
+ <SheetSelect
126
+ onSelect={(checked, index) => {
127
+ // 处理选中逻辑,使用 _gm_select 字段标记选中状态
128
+ }}
129
+ onSelectAll={(checked) => {
130
+ // 处理全选逻辑
131
+ }}
132
+ hasSelectTip
133
+ selectAllTip={<div>全选提示信息</div>}
134
+ />
135
+ <SheetBatchAction>
136
+ <Button>批量删除</Button>
137
+ </SheetBatchAction>
138
+ </Sheet>
139
+ ```
140
+
141
+ ### 带分页
142
+ ```jsx
143
+ <Sheet list={list}>
144
+ <SheetColumn field='name' name='名字' />
145
+ <Pagination
146
+ data={{ count: 70, offset: 0, limit: 10 }}
147
+ toPage={({ offset, limit }) => fetchData({ offset, limit })}
148
+ />
149
+ </Sheet>
150
+ ```
151
+
152
+ ### 可展开行
153
+ ```jsx
154
+ <Sheet
155
+ list={list}
156
+ expandedRowRender={(index) => (
157
+ <div>展开行内容:{list[index].name}</div>
158
+ )}
159
+ onExpand={(index) => {
160
+ // 切换展开状态,需要修改数据中 __gm_expanded 字段
161
+ }}
162
+ onExpandAll={() => {
163
+ // 全部展开/收起
164
+ }}
165
+ >
166
+ <SheetColumn field='name' name='名字' />
167
+ </Sheet>
168
+ ```
169
+
170
+ ## 注意事项
171
+ - Sheet 组件已废弃,建议使用 Table 组件替代,使用时会输出控制台警告
172
+ - 使用 `SheetSelect` 时,约定数据列表中的 `_gm_select` 字段表示选中状态(bool 类型)
173
+ - `onChange` 和 `onSelect` 的区别:`onChange` 会修改整个 list 数据,`onSelect` 只返回 checked 和 index
174
+ - `SheetBatchAction` 必须配合 `SheetSelect` 使用才会显示
175
+ - `Pagination` 和 `PaginationText` 作为 Sheet 的子组件时会自动排列到表格下方
176
+ - `getTrProps` 返回的属性会传递到每一行的 `<tr>` 上,可用于自定义行样式或属性
@@ -0,0 +1,55 @@
1
+ # Steps
2
+
3
+ ## 简介
4
+ 步骤条组件 - 展示操作流程的当前步骤进度,支持标题和描述信息。
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import Steps from '@gmfe/react/lib/steps'
12
+
13
+ <Steps
14
+ data={[
15
+ { title: '第一步' },
16
+ { title: '第二步', description: '这是第二步的描述' },
17
+ { title: '第三步', description: '这是第三步的描述' }
18
+ ]}
19
+ />
20
+ ```
21
+
22
+ ## API
23
+
24
+ ### Props
25
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
26
+ |------|------|------|--------|------|
27
+ | data | 步骤数据数组 | `{ title?: string, description?: string }[]` | - | 是 |
28
+ | className | 自定义类名 | `string` | - | 否 |
29
+
30
+ data 数组中每项的字段:
31
+
32
+ | 字段 | 说明 | 类型 | 必填 |
33
+ |------|------|------|------|
34
+ | title | 步骤标题 | `string` | 否 |
35
+ | description | 步骤描述 | `string` | 否 |
36
+
37
+ ## 示例
38
+
39
+ ### 基础用法
40
+ ```jsx
41
+ <Steps
42
+ data={[
43
+ { title: '第一步' },
44
+ { title: '第二步', description: '这是第二步' },
45
+ { title: '第三步', description: '这是第三步' },
46
+ { title: '第四步', description: '这是第四步' }
47
+ ]}
48
+ style={{ width: '300px' }}
49
+ />
50
+ ```
51
+
52
+ ## 注意事项
53
+ - 步骤条为垂直方向排列
54
+ - 每个步骤自动显示序号(从 1 开始)
55
+ - title 和 description 均为可选,可以只传 title 不传 description
@@ -0,0 +1,83 @@
1
+ # Storage
2
+
3
+ ## 简介
4
+ 本地存储组件 - 基于 localStorage 的封装,提供组件式和静态方法两种使用方式
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+
11
+ ### 组件方式
12
+ ```jsx
13
+ import { Storage } from '@gmfe/react'
14
+
15
+ <Storage name="myKey" value={myValue} />
16
+ ```
17
+
18
+ ### 静态方法方式
19
+ ```jsx
20
+ import { Storage } from '@gmfe/react'
21
+
22
+ Storage.set('key', 'value')
23
+ Storage.get('key')
24
+ Storage.remove('key')
25
+ ```
26
+
27
+ ## API
28
+
29
+ ### 组件 Props
30
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
31
+ |------|------|------|--------|------|
32
+ | name | 存储的键名 | `string` | - | 是 |
33
+ | value | 存储的值,支持 `string`、`object`、`array` | `string \| object \| array` | - | 否 |
34
+
35
+ ### 静态方法
36
+ | 方法 | 说明 | 参数 |
37
+ |------|------|------|
38
+ | `Storage.set(key, value)` | 设置存储值 | `key: string, value: any` |
39
+ | `Storage.get(key)` | 获取存储值 | `key: string` |
40
+ | `Storage.remove(key)` | 删除指定存储 | `key: string` |
41
+ | `Storage.clear()` | 清除本域名全部存储(慎用) | - |
42
+ | `Storage.getAll()` | 获取全部存储,以对象形式返回 | - |
43
+
44
+ ## 示例
45
+
46
+ ### 实时存储
47
+ ```jsx
48
+ function App() {
49
+ const [data, setData] = useState('hello')
50
+ return (
51
+ <div>
52
+ <input
53
+ type="text"
54
+ value={data}
55
+ onChange={e => setData(e.target.value)}
56
+ />
57
+ <Storage name="test" value={data} />
58
+ </div>
59
+ )
60
+ }
61
+ ```
62
+
63
+ ### 静态方法
64
+ ```jsx
65
+ // 设置值
66
+ Storage.set('username', '张三')
67
+ Storage.set('settings', { theme: 'dark', lang: 'zh' })
68
+
69
+ // 获取值
70
+ Storage.get('username') // '张三'
71
+
72
+ // 删除
73
+ Storage.remove('username')
74
+
75
+ // 获取全部
76
+ Storage.getAll() // { settings: { theme: 'dark', lang: 'zh' } }
77
+ ```
78
+
79
+ ## 注意事项
80
+ - 所有存储的 key 会自动添加 `_react-gm_` 前缀,避免与其他存储冲突
81
+ - 组件方式会在 `value` 变化时自动更新存储
82
+ - `Storage.clear()` 会清除本域名下全部 localStorage,请谨慎使用
83
+ - 内部使用 `JSON.stringify` / `JSON.parse` 序列化,支持存储对象和数组
@@ -0,0 +1,85 @@
1
+ # Switch
2
+
3
+ ## 简介
4
+ 开关组件 - 用于表示两种状态之间的切换,支持多种颜色类型和自定义开/关文案。
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import { Switch } from '@gmfe/react'
12
+
13
+ <Switch
14
+ checked={checked}
15
+ onChange={setChecked}
16
+ />
17
+ ```
18
+
19
+ ## API
20
+
21
+ ### Props
22
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
23
+ |------|------|------|--------|------|
24
+ | checked | 是否开启 | `bool` | - | 是 |
25
+ | onChange | 状态变化回调,参数为当前 checked 值 | `func` | `_.noop` | 否 |
26
+ | type | 颜色类型 | `'default' \| 'primary' \| 'success' \| 'info' \| 'warning' \| 'danger'` | `'default'` | 否 |
27
+ | disabled | 是否禁用 | `bool` | - | 否 |
28
+ | on | 开启时显示的文案 | `any` | `''` | 否 |
29
+ | off | 关闭时显示的文案 | `any` | `''` | 否 |
30
+ | className | 自定义类名 | `string` | - | 否 |
31
+ | style | 自定义样式 | `object` | - | 否 |
32
+
33
+ ## 示例
34
+
35
+ ### 基础用法
36
+ ```jsx
37
+ <Switch
38
+ checked={isWork}
39
+ onChange={checked => setIsWork(checked)}
40
+ />
41
+ ```
42
+
43
+ ### 带文案
44
+ ```jsx
45
+ <Switch
46
+ checked={checked}
47
+ onChange={setChecked}
48
+ on='开'
49
+ off='关'
50
+ />
51
+ ```
52
+
53
+ ### 不同颜色类型
54
+ ```jsx
55
+ <Switch type='default' checked onChange={_.noop} />
56
+ <Switch type='primary' checked onChange={_.noop} />
57
+ <Switch type='success' checked onChange={_.noop} />
58
+ <Switch type='info' checked onChange={_.noop} />
59
+ <Switch type='warning' checked onChange={_.noop} />
60
+ <Switch type='danger' checked onChange={_.noop} />
61
+ ```
62
+
63
+ ### 禁用状态
64
+ ```jsx
65
+ <Switch disabled checked onChange={_.noop} />
66
+ <Switch disabled onChange={_.noop} />
67
+ ```
68
+
69
+ ### 在表单中使用
70
+ ```jsx
71
+ <FormItem label='是否工作' required>
72
+ <Switch
73
+ checked={isWork}
74
+ onChange={checked => setIsWork(checked)}
75
+ />
76
+ </FormItem>
77
+ ```
78
+
79
+ ## 注意事项
80
+ - `checked` 为必填属性,建议使用受控模式
81
+ - 组件宽度会根据 `on` 和 `off` 文案自动调整,取两者中较宽者
82
+ - 建议保持 `on` 和 `off` 文案宽度一致,以获得更好的视觉效果
83
+ - 开关的最小宽度为 34px
84
+ - 非受控模式下(未传入 `checked`),组件内部自行管理状态
85
+ - 组件挂载时会自动计算开关宽度,确保文案完整显示
@@ -0,0 +1,92 @@
1
+ # TableSelect
2
+
3
+ ## 简介
4
+ 表格选择器组件 - 以表格形式展示选项列表的下拉选择器,支持多列显示和搜索过滤
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import { TableSelect } from '@gmfe/react'
12
+
13
+ <TableSelect
14
+ data={data}
15
+ columns={columns}
16
+ selected={selected}
17
+ onSelect={selected => setSelected(selected)}
18
+ />
19
+ ```
20
+
21
+ ## API
22
+
23
+ ### Props
24
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
25
+ |------|------|------|--------|------|
26
+ | data | 数据源,全部展示,没有内部过滤 | `array` | - | 是 |
27
+ | selected | 当前选中的值 | `any` | - | 否 |
28
+ | onSelect | 选中回调 | `function` | - | 是 |
29
+ | columns | 列定义,类似 ReactTable,格式:`[{Header, accessor, Cell, width}]` | `array` | - | 是 |
30
+ | disabled | 是否禁用 | `bool` | - | 否 |
31
+ | onSearch | 搜索回调,参数为 `(searchValue, data)` | `function` | - | 否 |
32
+ | delay | 搜索防抖延迟(毫秒) | `number` | - | 否 |
33
+ | searchPlaceholder | 搜索框占位文本 | `string` | - | 否 |
34
+ | renderListFilter | 列表过滤函数,参数为 `(searchValue, data)` | `function` | - | 否 |
35
+ | renderListFilterType | 指定默认的过滤类型 | `'default' \| 'pinyin'` | - | 否 |
36
+ | placeholder | 占位文本 | `string` | - | 否 |
37
+ | renderSelected | 定制已选区域的展示,参数为 `selected` | `function` | - | 否 |
38
+ | listHeight | 列表高度 | `string` | - | 否 |
39
+ | popoverType | 弹出框触发方式 | `'focus' \| 'realFocus'` | - | 否 |
40
+ | className | 自定义类名 | `string` | - | 否 |
41
+ | style | 自定义样式 | `object` | - | 否 |
42
+ | popupClassName | 弹出框自定义类名 | `string` | - | 否 |
43
+ | isKeyboard | 是否启用键盘导航 | `bool` | - | 否 |
44
+ | onKeyDown | 键盘事件回调 | `function` | - | 否 |
45
+
46
+ ### columns 配置
47
+ | 属性 | 说明 | 类型 | 必填 |
48
+ |------|------|------|------|
49
+ | Header | 列标题 | `string` | 是 |
50
+ | accessor | 字段访问器,支持字符串路径或函数 | `string \| function` | 否 |
51
+ | Cell | 自定义单元格渲染,参数为 `{original, index}` | `function` | 否 |
52
+ | width | 列宽度(px),建议设置 | `number` | 否 |
53
+
54
+ ## 示例
55
+
56
+ ### 基础用法
57
+ ```jsx
58
+ const data = [
59
+ { value: 'D1', text: '大白菜', original: { sku_id: 'D1', sku_name: '大白菜', supplier: '供应商A' } },
60
+ { value: 'D2', text: '小白菜', original: { sku_id: 'D2', sku_name: '小白菜', supplier: '供应商B' } }
61
+ ]
62
+
63
+ const columns = [
64
+ { Header: 'ID', accessor: 'original.sku_id', width: 100 },
65
+ { Header: '名字', accessor: 'original.sku_name', width: 100 },
66
+ { Header: '供应商', accessor: 'original.supplier', width: 100 }
67
+ ]
68
+
69
+ <TableSelect
70
+ data={data}
71
+ columns={columns}
72
+ selected={selected}
73
+ onSelect={selected => setSelected(selected)}
74
+ />
75
+ ```
76
+
77
+ ### 自定义单元格渲染
78
+ ```jsx
79
+ const columns = [
80
+ {
81
+ Header: '名字',
82
+ accessor: 'original.sku_name',
83
+ width: 100,
84
+ Cell: ({ original }) => <strong>{original.sku_name}</strong>
85
+ }
86
+ ]
87
+ ```
88
+
89
+ ## 注意事项
90
+ - 建议为每列设置 `width`,未设置时会在控制台输出警告
91
+ - 数据项需要包含 `value`、`text` 和 `original` 字段
92
+ - 空值单元格会显示为 `-`
@@ -0,0 +1,85 @@
1
+ # Tabs
2
+
3
+ ## 简介
4
+ 选项卡组件 - 支持受控和非受控两种模式,可通过 `lazy` 属性开启懒加载渲染。
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import Tabs from '@gmfe/react/lib/tabs'
12
+
13
+ // 非受控模式
14
+ <Tabs tabs={['选项1', '选项2', '选项3']} defaultActive={0}>
15
+ <div>内容1</div>
16
+ <div>内容2</div>
17
+ <div>内容3</div>
18
+ </Tabs>
19
+
20
+ // 受控模式
21
+ <Tabs
22
+ tabs={['选项1', '选项2', '选项3']}
23
+ active={activeIndex}
24
+ onChange={index => setActiveIndex(index)}
25
+ >
26
+ <div>内容1</div>
27
+ <div>内容2</div>
28
+ <div>内容3</div>
29
+ </Tabs>
30
+ ```
31
+
32
+ ## API
33
+
34
+ ### Props
35
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
36
+ |------|------|------|--------|------|
37
+ | tabs | 选项卡标题数组 | `string[]` | - | 是 |
38
+ | active | 当前激活的选项卡索引(受控模式) | `number` | - | 否 |
39
+ | defaultActive | 默认激活的选项卡索引(非受控模式) | `number` | `0` | 否 |
40
+ | lazy | 是否懒加载,开启后只渲染当前激活的选项卡内容 | `bool` | `false` | 否 |
41
+ | onChange | 选项卡切换回调,返回当前选中的索引 | `(index: number) => void` | - | 否 |
42
+ | children | 选项卡内容,长度必须与 tabs 数组一致 | `ReactNode[]` | - | 否 |
43
+
44
+ ## 示例
45
+
46
+ ### 受控模式
47
+ ```jsx
48
+ const [active, setActive] = useState(0)
49
+ const tabs = ['第一个', '第二个', '第三个']
50
+
51
+ <Tabs
52
+ tabs={tabs}
53
+ active={active}
54
+ onChange={index => setActive(index)}
55
+ >
56
+ <div>第一个选项卡内容</div>
57
+ <div>第二个选项卡内容</div>
58
+ <div>第三个选项卡内容</div>
59
+ </Tabs>
60
+ ```
61
+
62
+ ### 非受控模式
63
+ ```jsx
64
+ <Tabs tabs={['选项1', '选项2', '选项3']} defaultActive={2}>
65
+ <div>内容1</div>
66
+ <div>内容2</div>
67
+ <div>内容3</div>
68
+ </Tabs>
69
+ ```
70
+
71
+ ### 懒加载模式
72
+ ```jsx
73
+ <Tabs tabs={['选项1', '选项2', '选项3']} lazy>
74
+ <div>内容1</div>
75
+ <div>内容2</div>
76
+ <div>内容3</div>
77
+ </Tabs>
78
+ ```
79
+
80
+ ## 注意事项
81
+ - `active` 和 `defaultActive` 不能同时使用,否则会输出控制台警告
82
+ - 使用 `active`(受控模式)时,必须同时传入 `onChange`,否则会输出控制台警告
83
+ - `children` 的长度必须与 `tabs` 数组长度一致,否则会报错
84
+ - 非懒加载模式下,所有选项卡内容都会被渲染(通过 `hidden` 类名控制显示/隐藏)
85
+ - 懒加载模式下,只有当前激活的选项卡内容会被渲染,切换时会销毁之前的内容
@@ -0,0 +1,112 @@
1
+ # TimeSpan / TimeSpanPicker
2
+
3
+ ## 简介
4
+ 时间跨度选择组件 - TimeSpan 提供时间点选择面板,TimeSpanPicker 提供带输入框的时间选择器
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import { TimeSpan, TimeSpanPicker } from '@gmfe/react'
12
+
13
+ // 直接使用时间面板
14
+ <TimeSpan
15
+ selected={date}
16
+ onSelect={date => setDate(date)}
17
+ />
18
+
19
+ // 带输入框的时间选择器
20
+ <TimeSpanPicker
21
+ date={date}
22
+ onChange={date => setDate(date)}
23
+ />
24
+ ```
25
+
26
+ ## API
27
+
28
+ ### TimeSpan Props
29
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
30
+ |------|------|------|--------|------|
31
+ | min | 可选的最小时间(Date 对象),默认一天的开始时间 | `object` | 当天 `00:00` | 否 |
32
+ | max | 可选的最大时间(Date 对象),默认一天的结束时间 | `object` | 当天 `23:59` | 否 |
33
+ | disabledSpan | 禁用时间段函数,参数为 Date 对象,返回 `boolean` | `function` | - | 否 |
34
+ | span | 时间跨度(毫秒),默认为 30 分钟 | `number` | `1800000` (30分钟) | 否 |
35
+ | selected | 当前选中的时间(Date 对象) | `object` | - | 否 |
36
+ | renderItem | 渲染时间文本格式 | `function` | `(value) => moment(value).format('HH:mm')` | 否 |
37
+ | onSelect | 选中回调,参数为 Date 对象 | `function` | `_.noop` | 否 |
38
+ | beginTime | 自定义起始时间点(Date 对象),不传默认从 00:00 开始 | `object` | - | 否 |
39
+ | endTime | 自定义结束时间点(Date 对象) | `object` | - | 否 |
40
+ | enabledEndTimeOfDay | 是否展示 24:00 结束时间 | `bool` | `false` | 否 |
41
+
42
+ ### TimeSpanPicker Props
43
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
44
+ |------|------|------|--------|------|
45
+ | date | 当前选中的时间(Date 对象) | `object` | - | 是 |
46
+ | onChange | 选中回调,参数为 Date 对象 | `function` | `_.noop` | 否 |
47
+ | disabled | 是否禁用 | `bool` | - | 否 |
48
+ | min | 可选的最小时间(Date 对象) | `object` | - | 否 |
49
+ | max | 可选的最大时间(Date 对象) | `object` | - | 否 |
50
+ | span | 时间跨度(毫秒),默认为 30 分钟 | `number` | `1800000` (30分钟) | 否 |
51
+ | disabledSpan | 禁用时间段函数,参数为 Date 对象,返回 `boolean` | `function` | - | 否 |
52
+ | renderItem | 渲染时间文本格式 | `function` | `(value) => moment(value).format('HH:mm')` | 否 |
53
+ | beginTime | 自定义起始时间点(Date 对象) | `object` | - | 否 |
54
+ | endTime | 自定义结束时间点(Date 对象) | `object` | - | 否 |
55
+ | className | 自定义类名 | `string` | - | 否 |
56
+ | style | 自定义样式 | `object` | - | 否 |
57
+ | children | 自定义触发器元素 | `any` | - | 否 |
58
+ | isInPopup | 是否嵌套在其他弹出层中 | `bool` | `false` | 否 |
59
+ | enabledEndTimeOfDay | 是否展示 24:00 结束时间 | `bool` | `false` | 否 |
60
+
61
+ ## 示例
62
+
63
+ ### TimeSpan 基础用法
64
+ ```jsx
65
+ <TimeSpan
66
+ selected={date}
67
+ onSelect={date => setDate(date)}
68
+ />
69
+ ```
70
+
71
+ ### TimeSpan 禁用时间段
72
+ ```jsx
73
+ <TimeSpan
74
+ max={moment().hour(20).minute(0)}
75
+ disabledSpan={spanMoment =>
76
+ spanMoment.isSameOrAfter(moment('11:00', 'HH:mm')) &&
77
+ spanMoment.isSameOrBefore(moment('18:30', 'HH:mm'))
78
+ }
79
+ selected={date}
80
+ onSelect={date => setDate(date)}
81
+ />
82
+ ```
83
+
84
+ ### TimeSpan 自定义时间跨度
85
+ ```jsx
86
+ <TimeSpan
87
+ span={60 * 60 * 1000} // 1小时
88
+ renderItem={value => moment(value).format('HH')}
89
+ selected={date}
90
+ onSelect={date => setDate(date)}
91
+ />
92
+ ```
93
+
94
+ ### TimeSpanPicker 基础用法
95
+ ```jsx
96
+ <TimeSpanPicker
97
+ date={date}
98
+ onChange={date => setDate(date)}
99
+ />
100
+ ```
101
+
102
+ ### TimeSpanPicker 自定义触发器
103
+ ```jsx
104
+ <TimeSpanPicker date={date} onChange={date => setDate(date)}>
105
+ <span>{date ? moment(date).format('HH:mm') : '请点击选择'}</span>
106
+ </TimeSpanPicker>
107
+ ```
108
+
109
+ ## 注意事项
110
+ - 时间面板分三列展示,时间间隔较大时,某一列可能无数据
111
+ - `TimeSpanPicker` 内部使用 `Popover` 和 `Selection` 组件
112
+ - `disabledSpan` 可用于禁用特定时间段(如午休时间)