@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,101 @@
1
+ # Nav
2
+
3
+ ## 简介
4
+ 导航菜单组件 - 支持三级导航结构的侧边栏导航,鼠标悬停显示二级、三级菜单的弹出浮层。
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import Nav from '@gmfe/react/lib/nav'
12
+
13
+ <Nav
14
+ logo={<img src='/logo.png' alt='logo' />}
15
+ data={navData}
16
+ selected={currentPath}
17
+ onSelect={item => console.log(item)}
18
+ />
19
+ ```
20
+
21
+ ## API
22
+
23
+ ### Nav Props
24
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
25
+ |------|------|------|--------|------|
26
+ | logo | Logo 元素 | `ReactElement` | - | 否 |
27
+ | logoActive | Logo 区域是否激活 | `bool` | - | 否 |
28
+ | data | 三级菜单数据,结构为 `[{link, name, icon, sub: [{link, name, style, sub: [{link, name}]}]}]`,sub 没有的话就没有 popup | `array` | - | 是 |
29
+ | selected | 当前路由地址,会匹配到第三级 link | `string` | - | 是 |
30
+ | onSelect | 点击菜单回调,返回选中的第三级 item 数据 | `(item: object) => void` | - | 是 |
31
+ | showActive | 控制浮层的显示,传入对应一级菜单的 link 值 | `string` | - | 否 |
32
+ | other | 其他自定义内容元素(如应用中心入口),显示在底部 | `ReactElement` | - | 否 |
33
+ | className | 自定义类名 | `string` | - | 否 |
34
+ | style | 自定义样式 | `object` | - | 否 |
35
+
36
+ ### Nav.SingleItem Props
37
+ 用于在 `other` 属性中渲染无二级菜单的一级菜单项。
38
+
39
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
40
+ |------|------|------|--------|------|
41
+ | data | 菜单项数据,结构为 `{link, name, icon}` | `object` | - | 是 |
42
+ | selected | 当前路由地址 | `string` | - | 是 |
43
+ | onSelect | 点击菜单回调,返回当前 data | `(item: object) => void` | - | 是 |
44
+
45
+ ## 示例
46
+
47
+ ### 基础用法
48
+ ```jsx
49
+ const navData = [
50
+ {
51
+ link: '/merchandise',
52
+ name: '商品',
53
+ sub: [
54
+ {
55
+ name: '商品管理',
56
+ link: '/merchandise/manage',
57
+ sub: [
58
+ { link: '/merchandise/manage/sale', name: '报价单管理' },
59
+ { link: '/merchandise/manage/list', name: '商品库' }
60
+ ]
61
+ }
62
+ ]
63
+ },
64
+ {
65
+ link: '/supply_chain',
66
+ name: '供应链',
67
+ sub: [
68
+ {
69
+ name: '订单',
70
+ link: '/supply_chain/order',
71
+ sub: [
72
+ { link: '/supply_chain/order/list', name: '订单列表' }
73
+ ]
74
+ }
75
+ ]
76
+ }
77
+ ]
78
+
79
+ const application = { name: '应用中心', link: '/application_center' }
80
+
81
+ <Nav
82
+ logo={<img src='/logo.png' style={{ maxHeight: '35px', maxWidth: '80px' }} />}
83
+ data={navData}
84
+ selected='/merchandise/manage/sale'
85
+ onSelect={item => navigate(item.link)}
86
+ other={
87
+ <Nav.SingleItem
88
+ data={application}
89
+ selected={currentPath}
90
+ onSelect={item => navigate(item.link)}
91
+ />
92
+ }
93
+ />
94
+ ```
95
+
96
+ ## 注意事项
97
+ - data 为三级菜单结构,如果一级菜单没有 `sub` 字段则不会显示弹出浮层
98
+ - `selected` 传入当前路由地址,组件会自动匹配到第三级 link 并高亮显示
99
+ - 弹出浮层会自动适应屏幕底部边界,超出时会向上偏移
100
+ - 弹出浮层通过 Portal 渲染到 `gmNavPopupContainer` 容器中
101
+ - 使用 `Nav.SingleItem` 可在底部区域添加没有二级菜单的独立菜单项
@@ -0,0 +1,135 @@
1
+ # NProgress
2
+
3
+ ## 简介
4
+ 页面顶部进度条组件 - 在页面顶部显示加载进度条,适用于路由切换或异步请求时的全局加载指示,支持多次 start/done 的计数管理
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import { NProgress } from '@gmfe/react'
12
+ ```
13
+
14
+ ## API
15
+
16
+ ### 静态方法
17
+
18
+ | 方法 | 说明 | 参数 | 返回值 |
19
+ |------|------|------|--------|
20
+ | `NProgress.start()` | 开始显示进度条,内部维护计数器,多次调用不会重复显示 | - | - |
21
+ | `NProgress.done()` | 完成并隐藏进度条,每次调用减少计数器,计数归零时才真正隐藏 | - | - |
22
+
23
+ ## 示例
24
+
25
+ ### 基础用法
26
+
27
+ ```jsx
28
+ import { NProgress } from '@gmfe/react'
29
+
30
+ // 开始加载
31
+ NProgress.start()
32
+
33
+ // 加载完成后
34
+ NProgress.done()
35
+ ```
36
+
37
+ ### 配合 axios 请求拦截器使用
38
+
39
+ ```jsx
40
+ import axios from 'axios'
41
+ import { NProgress } from '@gmfe/react'
42
+
43
+ // 请求拦截器
44
+ axios.interceptors.request.use(config => {
45
+ NProgress.start()
46
+ return config
47
+ })
48
+
49
+ // 响应拦截器
50
+ axios.interceptors.response.use(
51
+ response => {
52
+ NProgress.done()
53
+ return response
54
+ },
55
+ error => {
56
+ NProgress.done()
57
+ return Promise.reject(error)
58
+ }
59
+ )
60
+ ```
61
+
62
+ ### 配合 React Router 路由切换使用
63
+
64
+ ```jsx
65
+ import React from 'react'
66
+ import { BrowserRouter, Route, Switch } from 'react-router-dom'
67
+ import { NProgress } from '@gmfe/react'
68
+
69
+ function App() {
70
+ return (
71
+ <BrowserRouter>
72
+ <Route
73
+ render={({ location }) => {
74
+ NProgress.start()
75
+ return (
76
+ <Switch location={location}>
77
+ <Route path="/" component={Home} />
78
+ <Route path="/about" component={About} />
79
+ </Switch>
80
+ )
81
+ }}
82
+ />
83
+ </BrowserRouter>
84
+ )
85
+ }
86
+
87
+ // 在页面组件中完成后调用
88
+ function Home() {
89
+ React.useEffect(() => {
90
+ NProgress.done()
91
+ }, [])
92
+
93
+ return <div>首页</div>
94
+ }
95
+ ```
96
+
97
+ ### 并发请求
98
+
99
+ ```jsx
100
+ // 多次 start 只会显示一个进度条
101
+ NProgress.start() // 计数: 1
102
+ NProgress.start() // 计数: 2
103
+ NProgress.start() // 计数: 3
104
+
105
+ // 每次 done 减少计数
106
+ NProgress.done() // 计数: 2, 进度条仍在
107
+ NProgress.done() // 计数: 1, 进度条仍在
108
+ NProgress.done() // 计数: 0, 进度条隐藏
109
+ ```
110
+
111
+ ### 配合 Promise.all 多个请求
112
+
113
+ ```jsx
114
+ async function loadPageData() {
115
+ NProgress.start()
116
+ try {
117
+ const [users, orders, products] = await Promise.all([
118
+ api.getUsers(),
119
+ api.getOrders(),
120
+ api.getProducts()
121
+ ])
122
+ // 处理数据...
123
+ } finally {
124
+ NProgress.done()
125
+ }
126
+ }
127
+ ```
128
+
129
+ ## 注意事项
130
+
131
+ - NProgress 使用内部计数器管理进度条的显示和隐藏,支持并发场景。多次调用 `start()` 只会显示一个进度条,需要相同次数的 `done()` 才会隐藏。
132
+ - 进度条完成后会有 250ms 的完成动画,然后才从 DOM 中移除。
133
+ - 进度条渲染到 `LayoutRoot` 中,位于页面顶部,通常不需要手动定位。
134
+ - 进度条有两种 CSS 状态:`gm-nprogress-loading`(加载中)和 `gm-nprogress-completed`(完成)。
135
+ - 不支持组件形式的调用,仅提供静态方法。
@@ -0,0 +1,87 @@
1
+ # Pagination
2
+
3
+ ## 简介
4
+ 分页组件 - 提供多种分页模式,包括带总数的分页、不带总数的分页以及纯文本展示模式。
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import Pagination from '@gmfe/react/lib/pagination/pagination'
12
+ import PaginationV2 from '@gmfe/react/lib/pagination/pagination_v2'
13
+ import PaginationText from '@gmfe/react/lib/pagination/pagination_text'
14
+ ```
15
+
16
+ ## API
17
+
18
+ ### Pagination Props
19
+ 带 `toPage` 回调的分页组件,根据 data 中是否包含 count 自动判断显示模式。
20
+
21
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
22
+ |------|------|------|--------|------|
23
+ | data | 分页数据 | `{ count?: number, offset: number, limit: number }` | - | 是 |
24
+ | toPage | 翻页回调,参数为 `{offset, limit}`,可直接用于请求后台 | `({offset, limit}) => void` | - | 是 |
25
+ | nextDisabled | 下一页按钮禁用(仅在 data 无 count 时有效) | `bool` | - | 否 |
26
+ | className | 自定义类名 | `string` | - | 否 |
27
+ | style | 自定义样式 | `object` | - | 否 |
28
+ | limitData | 自定义分页,默认空数组 | `array` | - | 否 |
29
+
30
+ ### PaginationV2 Props
31
+ 直接使用 `onChange` 回调的分页组件(一般通过 PaginationBox 使用)。
32
+
33
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
34
+ |------|------|------|--------|------|
35
+ | data | 分页数据,count 仅代表当前有多少条数据(非总数) | `{ count: number, offset: number, limit: number }` | - | 是 |
36
+ | onChange | 翻页回调,参数为 `{offset, limit}` | `({offset, limit}) => void` | - | 是 |
37
+ | showCount | 是否显示总数 | `bool` | - | 否 |
38
+ | className | 自定义类名 | `string` | - | 否 |
39
+ | style | 自定义样式 | `object` | - | 否 |
40
+
41
+ ### PaginationText Props
42
+ 纯文本展示分页信息(已废弃)。
43
+
44
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
45
+ |------|------|------|--------|------|
46
+ | data | 分页数据 | `{ count?: number, offset: number, limit: number }` | - | 否 |
47
+
48
+ ## 示例
49
+
50
+ ### Pagination 带总数
51
+ ```jsx
52
+ <Pagination
53
+ data={{ count: 70, offset: 0, limit: 10 }}
54
+ toPage={({ offset, limit }) => {
55
+ fetchData({ offset, limit })
56
+ }}
57
+ />
58
+ ```
59
+
60
+ ### Pagination 不带总数
61
+ ```jsx
62
+ <Pagination
63
+ data={{ offset: 0, limit: 10 }}
64
+ toPage={({ offset, limit }) => {
65
+ fetchData({ offset, limit })
66
+ }}
67
+ nextDisabled={false}
68
+ />
69
+ ```
70
+
71
+ ### PaginationV2
72
+ ```jsx
73
+ <PaginationV2
74
+ data={{ count: 70, offset: 0, limit: 10 }}
75
+ onChange={({ offset, limit }) => {
76
+ fetchData({ offset, limit })
77
+ }}
78
+ showCount
79
+ />
80
+ ```
81
+
82
+ ## 注意事项
83
+ - `Pagination` 组件根据 `data.count` 是否存在自动切换显示模式:有 count 时显示总数,无 count 时不显示总数
84
+ - `PaginationV2` 一般不直接使用,而是通过 `PaginationBox` 组件使用
85
+ - `PaginationText` 已废弃,使用时会在控制台输出警告
86
+ - `PaginationV2` 中 `data.count` 是当前数据条数,而非传统意义上的总条数
87
+ - 分页规范参考:[分页规范文档](https://www.yuque.com/iyum9i/cudrs0/etfogz)
@@ -0,0 +1,50 @@
1
+ # PicturePreview
2
+
3
+ ## 简介
4
+ 图片预览组件 - 基于 `react-photo-view` 的图片查看器,点击图片可放大预览
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import { PicturePreview } from '@gmfe/react'
12
+
13
+ <PicturePreview
14
+ images={['img1.jpg', 'img2.jpg', 'img3.jpg']}
15
+ />
16
+ ```
17
+
18
+ ## API
19
+
20
+ ### Props
21
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
22
+ |------|------|------|--------|------|
23
+ | images | 图片 URL 数组 | `array` | `[]` | 否 |
24
+ | className | 图片自定义类名 | `string` | - | 否 |
25
+
26
+ ## 示例
27
+
28
+ ### 基础用法
29
+ ```jsx
30
+ <PicturePreview
31
+ images={[
32
+ 'https://example.com/img1.jpg',
33
+ 'https://example.com/img2.jpg',
34
+ 'https://example.com/img3.jpg'
35
+ ]}
36
+ />
37
+ ```
38
+
39
+ ### 自定义样式
40
+ ```jsx
41
+ <PicturePreview
42
+ images={['img1.jpg', 'img2.jpg']}
43
+ className="custom-img-class"
44
+ />
45
+ ```
46
+
47
+ ## 注意事项
48
+ - 底层依赖 `react-photo-view`,需要确保该包已安装
49
+ - 图片点击后会进入全屏预览模式,支持缩放、滑动等手势操作
50
+ - 如果 `images` 为空或 `undefined`,不会渲染任何内容
@@ -0,0 +1,146 @@
1
+ # Popover
2
+
3
+ ## 简介
4
+ 弹出层组件 - 提供灵活的弹出气泡功能,支持 focus、click、hover、realFocus 四种触发方式,可控制弹出位置、偏移和箭头方向
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import { Popover } from '@gmfe/react'
12
+ ```
13
+
14
+ ## API
15
+
16
+ ### Props
17
+
18
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
19
+ |------|------|------|--------|------|
20
+ | type | 触发方式:`focus` 类似 click 但不因二次点击关闭;`click` 点击切换;`hover` 鼠标悬浮;`realFocus` 原生 focus 事件,失焦隐藏 | `'focus' \| 'click' \| 'hover' \| 'realFocus'` | `'focus'` | 否 |
21
+ | popup | 弹出层内容,支持传入元素或返回元素的函数 | `element \| func` | - | 是 |
22
+ | children | 触发元素(仅支持单个子元素) | `any` | - | 是 |
23
+ | disabled | 是否禁用弹出,也可以通过 children 的 `disabled` 属性控制 | `bool` | `false` | 否 |
24
+ | className | 弹出层自定义类名 | `string` | - | 否 |
25
+ | style | 弹出层自定义样式 | `object` | - | 否 |
26
+ | right | 是否右对齐弹出 | `bool` | `false` | 否 |
27
+ | top | 是否向上弹出 | `bool` | `false` | 否 |
28
+ | center | 是否居中对齐弹出 | `bool` | `false` | 否 |
29
+ | offset | 偏移量(像素) | `number` | `0` | 否 |
30
+ | showArrow | 是否显示三角标 | `bool` | `false` | 否 |
31
+ | arrowLeft | 三角标的左偏移位置 | `string` | - | 否 |
32
+ | pureContainer | 是否使用纯粹容器(无背景色、无阴影) | `bool` | `false` | 否 |
33
+ | isInPopup | 弹出层是否嵌套在另一个 popup 中 | `bool` | `false` | 否 |
34
+ | predictingHeight | 预判高度。因为 popup 的宽高是可变的,无法自动判断视窗内是否能放得下,可手动设置 | `number` | - | 否 |
35
+
36
+ ### 实例方法
37
+
38
+ | 方法 | 说明 | 参数 |
39
+ |------|------|------|
40
+ | `apiDoSetActive(active)` | 编程式控制弹出层的显示/隐藏 | `active: bool` |
41
+
42
+ ## 示例
43
+
44
+ ### 四种触发方式
45
+
46
+ ```jsx
47
+ // focus 模式(默认)- 类似 click 但不因二次点击关闭
48
+ <Popover popup={renderPopup()}>
49
+ <Button>focus me</Button>
50
+ </Popover>
51
+
52
+ // click 模式 - 点击切换显示/隐藏
53
+ <Popover type='click' popup={renderPopup()}>
54
+ <Button>click me</Button>
55
+ </Popover>
56
+
57
+ // hover 模式 - 鼠标悬浮显示,移开隐藏
58
+ <Popover type='hover' showArrow popup={renderPopup()}>
59
+ <Button>hover me</Button>
60
+ </Popover>
61
+
62
+ // realFocus 模式 - 原生 focus 事件,失焦自动隐藏
63
+ <Popover type='realFocus' showArrow popup={renderPopup()}>
64
+ <Button>realFocus me</Button>
65
+ </Popover>
66
+ ```
67
+
68
+ ### 控制弹出位置
69
+
70
+ ```jsx
71
+ // 默认 - 左下方弹出
72
+ <Popover popup={renderPopup()}>
73
+ <Button>默认位置</Button>
74
+ </Popover>
75
+
76
+ // 右对齐 - 右下方弹出
77
+ <Popover right popup={renderPopup()}>
78
+ <Button>右对齐</Button>
79
+ </Popover>
80
+
81
+ // 居中 - 正下方居中弹出
82
+ <Popover center popup={renderPopup()}>
83
+ <Button>居中对齐</Button>
84
+ </Popover>
85
+
86
+ // 向上 - 上方弹出
87
+ <Popover top popup={renderPopup()}>
88
+ <Button>向上弹出</Button>
89
+ </Popover>
90
+ ```
91
+
92
+ ### 偏移位置
93
+
94
+ ```jsx
95
+ <Popover offset={20} popup={renderPopup()}>
96
+ <Button>向下偏移 20px</Button>
97
+ </Popover>
98
+
99
+ <Popover offset={-20} popup={renderPopup()}>
100
+ <Button>向上偏移 20px</Button>
101
+ </Popover>
102
+ ```
103
+
104
+ ### 带箭头
105
+
106
+ ```jsx
107
+ <Popover showArrow popup={renderPopup()}>
108
+ <Button>带箭头</Button>
109
+ </Popover>
110
+
111
+ // 自定义箭头位置
112
+ <Popover showArrow arrowLeft='0px' popup={renderPopup()}>
113
+ <Button>箭头靠左</Button>
114
+ </Popover>
115
+ ```
116
+
117
+ ### 禁用状态
118
+
119
+ ```jsx
120
+ // 通过 disabled 属性
121
+ <Popover disabled popup={renderPopup()}>
122
+ <Button>已禁用</Button>
123
+ </Popover>
124
+
125
+ // 通过子元素的 disabled 属性
126
+ <Popover popup={renderPopup()}>
127
+ <Button disabled>子元素禁用</Button>
128
+ </Popover>
129
+ ```
130
+
131
+ ### 使用函数作为 popup
132
+
133
+ ```jsx
134
+ <Popover popup={() => <div>动态内容</div>}>
135
+ <Button>函数式 popup</Button>
136
+ </Popover>
137
+ ```
138
+
139
+ ## 注意事项
140
+
141
+ - Popover 只接受单个子元素(`React.Children.only`),需要用一个容器元素包裹触发内容。
142
+ - `type` 为 `focus` 时,行为类似 click 但不会因二次点击而关闭弹出层;如需真正的原生 focus 效果(失焦隐藏),请使用 `type='realFocus'`。
143
+ - `popup` 属性不会随组件 re-render 自动更新,如需动态内容请使用函数形式传入。
144
+ - Popover 会自动监听 Modal 滚动、Drawer 滚动、浏览器滚动和表格滚动事件,滚动时自动重新计算弹出层位置。
145
+ - hover 模式下,鼠标移出触发元素后会有 500ms 的延迟才关闭弹出层。
146
+ - `disabled` 支持两种方式:通过 Popover 的 `disabled` 属性,或通过子元素的 `disabled` 属性自动检测。
@@ -0,0 +1,121 @@
1
+ # Popup
2
+
3
+ ## 简介
4
+ 弹出定位组件 - 基于目标元素位置的弹出层容器,自动计算弹出位置并支持视窗边界检测,通常配合 Popover 组件使用
5
+
6
+ ## 安装
7
+ 已包含在 `@gmfe/react` 中,无需额外安装。
8
+
9
+ ## 使用
10
+ ```jsx
11
+ import { Popup, PopupContentConfirm } from '@gmfe/react'
12
+ ```
13
+
14
+ ## API
15
+
16
+ ### Popup 组件 Props
17
+
18
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
19
+ |------|------|------|--------|------|
20
+ | children | 弹出层内容 | `any` | - | 否 |
21
+ | rect | 目标元素的位置信息(包含 `top`、`left`、`width`、`height`) | `object` | - | 是 |
22
+ | className | 自定义类名 | `string` | - | 否 |
23
+ | style | 自定义样式 | `object` | - | 否 |
24
+ | top | 是否向上弹出 | `bool` | `false` | 否 |
25
+ | right | 是否右对齐弹出 | `bool` | `false` | 否 |
26
+ | center | 是否居中对齐弹出 | `bool` | `false` | 否 |
27
+ | offset | 偏移量(像素) | `number` | `0` | 否 |
28
+ | showArrow | 是否显示三角标 | `bool` | `false` | 否 |
29
+ | arrowLeft | 三角标的左偏移位置 | `string` | - | 否 |
30
+ | predictingHeight | 预判高度,因弹出层宽高可变无法自动判断视窗内是否能放得下时可手动设置 | `number` | - | 否 |
31
+ | pureContainer | 是否使用纯粹容器(无背景色、无阴影) | `bool` | `false` | 否 |
32
+
33
+ ### PopupContentConfirm 组件 Props
34
+
35
+ | 属性 | 说明 | 类型 | 默认值 | 必填 |
36
+ |------|------|------|--------|------|
37
+ | type | 确认类型,决定底部按钮的展示方式 | `'save' \| 'delete'` | `'save'` | 否 |
38
+ | title | 标题 | `string` | - | 否 |
39
+ | onCancel | 取消回调 | `func` | - | 是 |
40
+ | onDelete | 删除回调(`type='delete'` 时使用) | `func` | - | 否 |
41
+ | onSave | 保存回调(`type='save'` 时使用) | `func` | - | 否 |
42
+ | className | 自定义类名 | `string` | - | 否 |
43
+ | hideClose | 是否隐藏关闭按钮 | `bool` | `false` | 否 |
44
+ | style | 自定义样式 | `object` | - | 否 |
45
+ | children | 内容 | `any` | - | 否 |
46
+
47
+ ## 示例
48
+
49
+ ### Popup 基础用法
50
+
51
+ Popup 通常由 Popover 组件内部调用,以下展示直接使用的场景:
52
+
53
+ ```jsx
54
+ <Popup
55
+ rect={{ top: 100, left: 200, width: 100, height: 40 }}
56
+ showArrow
57
+ >
58
+ <div>弹出层内容</div>
59
+ </Popup>
60
+ ```
61
+
62
+ ### Popup 向上弹出
63
+
64
+ ```jsx
65
+ <Popup
66
+ rect={{ top: 300, left: 200, width: 100, height: 40 }}
67
+ top
68
+ showArrow
69
+ >
70
+ <div>向上弹出的内容</div>
71
+ </Popup>
72
+ ```
73
+
74
+ ### PopupContentConfirm - 保存类型
75
+
76
+ ```jsx
77
+ <PopupContentConfirm
78
+ title="编辑信息"
79
+ onCancel={() => console.log('取消')}
80
+ onSave={() => console.log('保存')}
81
+ >
82
+ <div>
83
+ <input placeholder="请输入内容" />
84
+ </div>
85
+ </PopupContentConfirm>
86
+ ```
87
+
88
+ ### PopupContentConfirm - 删除类型
89
+
90
+ ```jsx
91
+ <PopupContentConfirm
92
+ type="delete"
93
+ title="确认删除"
94
+ onCancel={() => console.log('取消')}
95
+ onDelete={() => console.log('删除')}
96
+ >
97
+ <div>确定要删除这条数据吗?</div>
98
+ </PopupContentConfirm>
99
+ ```
100
+
101
+ ### PopupContentConfirm - 隐藏关闭按钮
102
+
103
+ ```jsx
104
+ <PopupContentConfirm
105
+ title="不可关闭"
106
+ hideClose
107
+ onCancel={() => console.log('取消')}
108
+ onSave={() => console.log('保存')}
109
+ >
110
+ <div>内容区域</div>
111
+ </PopupContentConfirm>
112
+ ```
113
+
114
+ ## 注意事项
115
+
116
+ - Popup 通常不直接使用,而是由 Popover 组件内部管理。如需弹出层功能,建议直接使用 Popover 组件。
117
+ - Popup 具有自动边界检测能力:当向上弹出空间不足时会自动切换到向下弹出,反之亦然。
118
+ - `rect` 属性是必填项,需要包含目标元素的 `top`、`left`、`width`、`height` 信息。
119
+ - `pureContainer` 为 `true` 时,弹出层将去除背景色和阴影,适用于需要自定义外观的场景。
120
+ - PopupContentConfirm 是一个预设布局的弹出内容组件,提供了标题、内容区和底部操作按钮的标准结构。
121
+ - PopupContentConfirm 的 `type` 属性控制底部按钮:`save` 显示"取消"和"保存"按钮,`delete` 显示"取消"和红色"删除"按钮。