@beppla/tapas-ui 1.5.2 → 1.5.7
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.
- package/commonjs/Alert/README.md +75 -0
- package/commonjs/BarChart/README.md +172 -0
- package/commonjs/Button/README.md +108 -0
- package/commonjs/Calendar/Calendar.base.js +1 -1
- package/commonjs/Calendar/Calendar.base.js.map +1 -1
- package/commonjs/Calendar/README.md +410 -0
- package/commonjs/Card/README.md +126 -0
- package/commonjs/CheckBox/README.md +147 -0
- package/commonjs/CircularProgress/README.md +70 -0
- package/commonjs/Collapsible/README.md +140 -0
- package/commonjs/ComboChart/README.md +124 -0
- package/commonjs/DashboardCard/README.md +120 -0
- package/commonjs/DataTable/README.md +159 -0
- package/commonjs/DeviceSelectionModal/README.md +124 -0
- package/commonjs/DraggableFlatList/README.md +35 -0
- package/commonjs/Drawer/README.md +175 -0
- package/commonjs/Dropdown/Dropdown.js +60 -30
- package/commonjs/Dropdown/Dropdown.js.map +1 -1
- package/commonjs/Dropdown/README.md +230 -0
- package/commonjs/ExternalLink/README.md +81 -0
- package/commonjs/Gantt/README.md +155 -0
- package/commonjs/Grid/README.md +197 -0
- package/commonjs/Header/README.md +109 -0
- package/commonjs/HelloWave/README.md +28 -0
- package/commonjs/Hoverable/Hoverable.js.map +1 -1
- package/commonjs/IconText/README.md +99 -0
- package/commonjs/Image/PreviewImg/README.md +100 -0
- package/commonjs/Image/README.md +88 -0
- package/commonjs/Input/Input.js +60 -4
- package/commonjs/Input/Input.js.map +1 -1
- package/commonjs/Layout/README.md +174 -0
- package/commonjs/LineChart/README.md +181 -0
- package/commonjs/ListItem/README.md +122 -0
- package/commonjs/MessageBox/MessageBox.js +7 -1
- package/commonjs/MessageBox/MessageBox.js.map +1 -1
- package/commonjs/MessageBox/README.md +120 -0
- package/commonjs/Navigation/README.md +197 -0
- package/commonjs/NumericInput/README.md +95 -0
- package/commonjs/Overlay/README.md +84 -0
- package/commonjs/Pagination/README.md +106 -0
- package/commonjs/PieChart/README.md +212 -0
- package/commonjs/Popover/README.md +82 -0
- package/commonjs/Progress/README.md +106 -0
- package/commonjs/RadioButton/README.md +85 -0
- package/commonjs/ScanButton/README.md +72 -0
- package/commonjs/SearchInput/SearchInput.js.map +1 -1
- package/commonjs/SheetTitle/README.md +89 -0
- package/commonjs/Shell/README.md +152 -0
- package/commonjs/Shell/Shell.js.map +1 -1
- package/commonjs/StatisticCard/README.md +129 -0
- package/commonjs/Status/README.md +75 -0
- package/commonjs/Steps/README.md +76 -0
- package/commonjs/Switch/Switch.js +101 -0
- package/commonjs/Switch/Switch.js.map +1 -0
- package/commonjs/Tab/README.md +161 -0
- package/commonjs/Tag/README.md +93 -0
- package/commonjs/Task/README.md +110 -0
- package/commonjs/Text/README.md +97 -0
- package/commonjs/TextArea/README.md +127 -0
- package/commonjs/TextArea/TextArea.js +4 -2
- package/commonjs/TextArea/TextArea.js.map +1 -1
- package/commonjs/Theme/README.md +161 -0
- package/commonjs/Theme/makeStyles.js +30 -0
- package/commonjs/Theme/makeStyles.js.map +1 -0
- package/commonjs/Theme/withTheme.js +91 -0
- package/commonjs/Theme/withTheme.js.map +1 -0
- package/commonjs/Timeline/README.md +111 -0
- package/commonjs/Toast/README.md +96 -0
- package/commonjs/Upload/Upload.js +126 -0
- package/commonjs/Upload/Upload.js.map +1 -0
- package/commonjs/index.js +24 -4
- package/commonjs/index.js.map +1 -1
- package/module/Alert/README.md +75 -0
- package/module/BarChart/README.md +172 -0
- package/module/Button/README.md +108 -0
- package/module/Calendar/Calendar.base.js +1 -1
- package/module/Calendar/Calendar.base.js.map +1 -1
- package/module/Calendar/README.md +410 -0
- package/module/Card/README.md +126 -0
- package/module/CheckBox/README.md +147 -0
- package/module/CircularProgress/README.md +70 -0
- package/module/Collapsible/README.md +140 -0
- package/module/ComboChart/README.md +124 -0
- package/module/DashboardCard/README.md +120 -0
- package/module/DataTable/README.md +159 -0
- package/module/DeviceSelectionModal/README.md +124 -0
- package/module/DraggableFlatList/README.md +35 -0
- package/module/Drawer/README.md +175 -0
- package/module/Dropdown/Dropdown.js +60 -30
- package/module/Dropdown/Dropdown.js.map +1 -1
- package/module/Dropdown/README.md +230 -0
- package/module/ExternalLink/README.md +81 -0
- package/module/Gantt/README.md +155 -0
- package/module/Grid/README.md +197 -0
- package/module/Header/README.md +109 -0
- package/module/HelloWave/README.md +28 -0
- package/module/Hoverable/Hoverable.js.map +1 -1
- package/module/IconText/README.md +99 -0
- package/module/Image/PreviewImg/README.md +100 -0
- package/module/Image/README.md +88 -0
- package/module/Input/Input.js +60 -4
- package/module/Input/Input.js.map +1 -1
- package/module/Layout/README.md +174 -0
- package/module/LineChart/README.md +181 -0
- package/module/ListItem/README.md +122 -0
- package/module/MessageBox/MessageBox.js +8 -2
- package/module/MessageBox/MessageBox.js.map +1 -1
- package/module/MessageBox/README.md +120 -0
- package/module/Navigation/README.md +197 -0
- package/module/NumericInput/README.md +95 -0
- package/module/Overlay/README.md +84 -0
- package/module/Pagination/README.md +106 -0
- package/module/PieChart/README.md +212 -0
- package/module/Popover/README.md +82 -0
- package/module/Progress/README.md +106 -0
- package/module/RadioButton/README.md +85 -0
- package/module/ScanButton/README.md +72 -0
- package/module/SearchInput/SearchInput.js.map +1 -1
- package/module/SheetTitle/README.md +89 -0
- package/module/Shell/README.md +152 -0
- package/module/Shell/Shell.js.map +1 -1
- package/module/StatisticCard/README.md +129 -0
- package/module/Status/README.md +75 -0
- package/module/Steps/README.md +76 -0
- package/module/Switch/Switch.js +96 -0
- package/module/Switch/Switch.js.map +1 -0
- package/module/Tab/README.md +161 -0
- package/module/Tag/README.md +93 -0
- package/module/Task/README.md +110 -0
- package/module/Text/README.md +97 -0
- package/module/TextArea/README.md +127 -0
- package/module/TextArea/TextArea.js +4 -2
- package/module/TextArea/TextArea.js.map +1 -1
- package/module/Theme/README.md +161 -0
- package/module/Theme/makeStyles.js +24 -0
- package/module/Theme/makeStyles.js.map +1 -0
- package/module/Theme/withTheme.js +82 -0
- package/module/Theme/withTheme.js.map +1 -0
- package/module/Timeline/README.md +111 -0
- package/module/Toast/README.md +96 -0
- package/module/Upload/Upload.js +121 -0
- package/module/Upload/Upload.js.map +1 -0
- package/module/index.js +11 -3
- package/module/index.js.map +1 -1
- package/package.json +1 -1
- package/typescript/Dropdown/Dropdown.d.ts +20 -0
- package/typescript/Dropdown/Dropdown.d.ts.map +1 -1
- package/typescript/Grid/FixedSizeGrid.d.ts +1 -3
- package/typescript/Grid/FixedSizeGrid.d.ts.map +1 -1
- package/typescript/Grid/Grid.base.d.ts +1 -3
- package/typescript/Grid/Grid.base.d.ts.map +1 -1
- package/typescript/Grid/VariableSizeGrid.d.ts +1 -3
- package/typescript/Grid/VariableSizeGrid.d.ts.map +1 -1
- package/typescript/Input/Input.d.ts +5 -0
- package/typescript/Input/Input.d.ts.map +1 -1
- package/typescript/MessageBox/MessageBox.d.ts.map +1 -1
- package/typescript/SearchInput/SearchInput.d.ts +4 -0
- package/typescript/SearchInput/SearchInput.d.ts.map +1 -1
- package/typescript/Switch/Switch.d.ts +15 -0
- package/typescript/Switch/Switch.d.ts.map +1 -0
- package/typescript/TextArea/TextArea.d.ts +2 -0
- package/typescript/TextArea/TextArea.d.ts.map +1 -1
- package/typescript/Theme/makeStyles.d.ts +11 -0
- package/typescript/Theme/makeStyles.d.ts.map +1 -0
- package/typescript/Theme/withTheme.d.ts +12 -0
- package/typescript/Theme/withTheme.d.ts.map +1 -0
- package/typescript/Upload/Upload.d.ts +25 -0
- package/typescript/Upload/Upload.d.ts.map +1 -0
- package/typescript/WebViewBridge/useWebViewBridge.d.ts +1 -1
- package/typescript/WebViewBridge/useWebViewBridge.d.ts.map +1 -1
- package/typescript/common/hooks/useBridgelessFix.d.ts +1 -1
- package/typescript/index.d.ts +8 -2
- package/typescript/index.d.ts.map +1 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Grid 虚拟滚动网格组件
|
|
2
|
+
|
|
3
|
+
高性能虚拟滚动网格组件,支持固定尺寸和可变尺寸的行列,可处理数千行列的大型数据集。包含三个变体:**StaticFixedSizeGrid**(粘性列 + 列头)、**FixedSizeGrid**(等宽等高)、**VariableSizeGrid**(动态行列尺寸),满足从简单表格到复杂数据面板的各种场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 虚拟滚动渲染:仅渲染可视区域内的单元格,支持数千行列
|
|
8
|
+
- ✅ 三种 Grid 变体:StaticFixedSizeGrid / FixedSizeGrid / VariableSizeGrid
|
|
9
|
+
- ✅ 粘性列(Sticky Columns):指定列固定在右侧,水平滚动时不跟随
|
|
10
|
+
- ✅ 粘性列头(Sticky Headers):列头固定在顶部,垂直滚动时不跟随
|
|
11
|
+
- ✅ 可变行高和列宽:VariableSizeGrid 支持通过函数动态返回尺寸
|
|
12
|
+
- ✅ 滚动同步:多个 Grid 实例间的滚动联动
|
|
13
|
+
- ✅ 滚动阴影指示器:左右边缘滚动时显示阴影
|
|
14
|
+
- ✅ RTL(右到左)布局支持
|
|
15
|
+
- ✅ Overscan 预渲染:提前渲染可视区外的行列,减少滚动白屏
|
|
16
|
+
- ✅ scrollTo / scrollToItem 命令式滚动 API
|
|
17
|
+
- ✅ 自定义边框和圆角控制
|
|
18
|
+
- ✅ hasActions 支持:特定单元格允许 overflow visible(下拉菜单不被裁切)
|
|
19
|
+
|
|
20
|
+
## 安装使用
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
import {
|
|
24
|
+
StaticFixedSizeGrid,
|
|
25
|
+
FixedSizeGrid,
|
|
26
|
+
VariableSizeGrid,
|
|
27
|
+
} from '@beppla/tapas-ui';
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## StaticFixedSizeGrid Props
|
|
31
|
+
|
|
32
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
33
|
+
|------|------|--------|------|
|
|
34
|
+
| columnCount | `number` | - | 总列数(必填) |
|
|
35
|
+
| columnWidth | `(index: number) => number` | - | 列宽函数(必填) |
|
|
36
|
+
| rowCount | `number` | - | 总行数(必填) |
|
|
37
|
+
| rowHeight | `(index: number) => number` | - | 行高函数(必填) |
|
|
38
|
+
| width | `number` | - | 容器宽度(必填) |
|
|
39
|
+
| height | `number` | - | 容器高度(必填) |
|
|
40
|
+
| children | `(props: ChildrenProps) => ReactNode` | - | 单元格渲染函数(必填) |
|
|
41
|
+
| headersRender | `(props: ChildrenProps) => JSX.Element` | - | 列头渲染函数 |
|
|
42
|
+
| columnHeaderHeight | `number` | `40` | 列头高度 |
|
|
43
|
+
| columnHeaderBackgroundColor | `string` | 主题 grey4 | 列头背景色 |
|
|
44
|
+
| stickyColumnIndices | `number[]` | - | 粘性列索引数组 |
|
|
45
|
+
| border | `boolean` | `false` | 是否显示边框 |
|
|
46
|
+
| onScroll | `(event) => void` | - | 滚动回调 |
|
|
47
|
+
| hideBorder | `string[]` | - | 隐藏指定方向边框(top/bottom/left/right) |
|
|
48
|
+
| hideborderRadius | `string[]` | - | 隐藏指定角的圆角(topLeft/topRight) |
|
|
49
|
+
| hasActions | `(columnIndex, rowIndex) => boolean` | - | 判断单元格是否有下拉操作菜单 |
|
|
50
|
+
| gridRef | `React.MutableRefObject<any>` | - | Grid 实例引用 |
|
|
51
|
+
| style | `Object` | - | 自定义容器样式 |
|
|
52
|
+
|
|
53
|
+
### ChildrenProps
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
interface ChildrenProps {
|
|
57
|
+
columnIndex: number;
|
|
58
|
+
rowIndex: number;
|
|
59
|
+
style: CSSProperties;
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## FixedSizeGrid Props
|
|
64
|
+
|
|
65
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
66
|
+
|------|------|--------|------|
|
|
67
|
+
| columnCount | `number` | - | 总列数(必填) |
|
|
68
|
+
| columnWidth | `number` | - | 固定列宽(必填) |
|
|
69
|
+
| rowCount | `number` | - | 总行数(必填) |
|
|
70
|
+
| rowHeight | `number` | - | 固定行高(必填) |
|
|
71
|
+
| width | `number` | - | 容器宽度(必填) |
|
|
72
|
+
| height | `number` | - | 容器高度(必填) |
|
|
73
|
+
| children | `RenderComponent<T>` | - | 单元格渲染组件(必填) |
|
|
74
|
+
| itemData | `T` | - | 传递给子组件的数据 |
|
|
75
|
+
| direction | `'ltr' \| 'rtl'` | `'ltr'` | 文本方向 |
|
|
76
|
+
| overscanColumnCount | `number` | `1` | 列预渲染数量 |
|
|
77
|
+
| overscanRowCount | `number` | `1` | 行预渲染数量 |
|
|
78
|
+
| onScroll | `OnScrollCallback` | - | 滚动回调 |
|
|
79
|
+
| onItemsRendered | `OnItemsRenderedCallback` | - | 可见区域变化回调 |
|
|
80
|
+
|
|
81
|
+
## VariableSizeGrid Props
|
|
82
|
+
|
|
83
|
+
与 FixedSizeGrid 相同,但 `columnWidth` 和 `rowHeight` 为函数类型:
|
|
84
|
+
|
|
85
|
+
| 属性 | 类型 | 说明 |
|
|
86
|
+
|------|------|------|
|
|
87
|
+
| columnWidth | `(index: number) => number` | 根据索引返回列宽 |
|
|
88
|
+
| rowHeight | `(index: number) => number` | 根据索引返回行高 |
|
|
89
|
+
|
|
90
|
+
## 使用示例
|
|
91
|
+
|
|
92
|
+
### StaticFixedSizeGrid(粘性列 + 列头)
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
const columnWidths = [100, 150, 200, 120, 80];
|
|
96
|
+
|
|
97
|
+
const Cell = ({ columnIndex, rowIndex, style }: ChildrenProps) => (
|
|
98
|
+
<div style={style}>
|
|
99
|
+
Item {rowIndex},{columnIndex}
|
|
100
|
+
</div>
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
const ColumnHeaders = ({ columnIndex, style }: ChildrenProps) => (
|
|
104
|
+
<div style={style}>Header {columnIndex}</div>
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
<StaticFixedSizeGrid
|
|
108
|
+
columnCount={5}
|
|
109
|
+
columnWidth={(index) => columnWidths[index]}
|
|
110
|
+
rowCount={1000}
|
|
111
|
+
rowHeight={() => 56}
|
|
112
|
+
width={650}
|
|
113
|
+
height={400}
|
|
114
|
+
border={true}
|
|
115
|
+
headersRender={ColumnHeaders}
|
|
116
|
+
stickyColumnIndices={[4]}
|
|
117
|
+
>
|
|
118
|
+
{Cell}
|
|
119
|
+
</StaticFixedSizeGrid>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### FixedSizeGrid(等宽等高)
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
<FixedSizeGrid
|
|
126
|
+
columnCount={1000}
|
|
127
|
+
columnWidth={75}
|
|
128
|
+
rowCount={1000}
|
|
129
|
+
rowHeight={40}
|
|
130
|
+
width={300}
|
|
131
|
+
height={300}
|
|
132
|
+
>
|
|
133
|
+
{Cell}
|
|
134
|
+
</FixedSizeGrid>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### VariableSizeGrid(动态尺寸)
|
|
138
|
+
|
|
139
|
+
```tsx
|
|
140
|
+
<VariableSizeGrid
|
|
141
|
+
columnCount={1000}
|
|
142
|
+
columnWidth={(index) => 75 + Math.round(Math.random() * 50)}
|
|
143
|
+
rowCount={1000}
|
|
144
|
+
rowHeight={(index) => (index % 2 === 0 ? 40 : 56)}
|
|
145
|
+
width={300}
|
|
146
|
+
height={300}
|
|
147
|
+
>
|
|
148
|
+
{Cell}
|
|
149
|
+
</VariableSizeGrid>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 多 Grid 滚动联动
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
const gridRef = useRef(null);
|
|
156
|
+
|
|
157
|
+
<StaticFixedSizeGrid
|
|
158
|
+
columnCount={20}
|
|
159
|
+
columnWidth={(i) => widths[i]}
|
|
160
|
+
rowCount={100}
|
|
161
|
+
rowHeight={() => 56}
|
|
162
|
+
width={650}
|
|
163
|
+
height={400}
|
|
164
|
+
onScroll={(event) => {
|
|
165
|
+
gridRef.current?.scrollTo({
|
|
166
|
+
...event,
|
|
167
|
+
scrollTop: gridRef.current.state.scrollTop,
|
|
168
|
+
});
|
|
169
|
+
}}
|
|
170
|
+
headersRender={Headers}
|
|
171
|
+
>
|
|
172
|
+
{Cell}
|
|
173
|
+
</StaticFixedSizeGrid>
|
|
174
|
+
|
|
175
|
+
<StaticFixedSizeGrid
|
|
176
|
+
gridRef={gridRef}
|
|
177
|
+
columnCount={20}
|
|
178
|
+
columnWidth={(i) => widths[i]}
|
|
179
|
+
rowCount={50}
|
|
180
|
+
rowHeight={() => 56}
|
|
181
|
+
width={650}
|
|
182
|
+
height={300}
|
|
183
|
+
>
|
|
184
|
+
{Cell}
|
|
185
|
+
</StaticFixedSizeGrid>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## 注意事项
|
|
189
|
+
|
|
190
|
+
- StaticFixedSizeGrid 内部基于 VariableSizeGrid + StickyListContext 实现
|
|
191
|
+
- 粘性列通过独立的 VariableSizeGrid 实例渲染,使用 `position: sticky` 固定
|
|
192
|
+
- 滚动同步使用 RAF(requestAnimationFrame)节流优化性能
|
|
193
|
+
- `hasActions` 为 true 的单元格设置 `overflow: visible` 允许下拉菜单溢出
|
|
194
|
+
- 列头同步滚动通过 `headerRef.scrollTo()` 实现
|
|
195
|
+
- FixedSizeGrid 的 `columnWidth` 和 `rowHeight` 必须是 number 类型
|
|
196
|
+
- VariableSizeGrid 的 `columnWidth` 和 `rowHeight` 必须是函数类型
|
|
197
|
+
- 组件基于 Web DOM(div),仅适用于 `Platform.OS === 'web'`
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Header
|
|
2
|
+
|
|
3
|
+
应用页眉组件,提供顶部导航栏功能,包含标题显示、左侧菜单/返回按钮、搜索框和用户头像。自动适配桌面端和移动端的不同展示形式。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- 自适应响应式设计(桌面端和移动端标题字号、搜索框形态自动切换)
|
|
8
|
+
- 支持左侧菜单按钮(`showLeftIcon`)和返回按钮(`hasBack`)
|
|
9
|
+
- 桌面端搜索框为完整输入框(168px),移动端为圆形搜索图标
|
|
10
|
+
- 用户头像显示(圆形 Avatar)并支持点击事件
|
|
11
|
+
- 标题长文本自动省略号处理(桌面端 `text-overflow: ellipsis`)
|
|
12
|
+
- 搜索文本变化实时回调
|
|
13
|
+
- 可自定义左侧图标名称
|
|
14
|
+
- 固定高度 72px
|
|
15
|
+
|
|
16
|
+
## 安装使用
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { Header } from '@beppla/tapas-ui';
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
25
|
+
|------|------|--------|------|
|
|
26
|
+
| title | `string` | - | 页眉标题文本 |
|
|
27
|
+
| hasBack | `boolean` | `false` | 是否显示返回按钮 |
|
|
28
|
+
| showLeftIcon | `boolean` | `false` | 是否显示左侧菜单按钮 |
|
|
29
|
+
| leftIcon | `string` | `'menu'` | 左侧图标名称 |
|
|
30
|
+
| onLeftIconPress | `() => void` | - | 左侧按钮/返回按钮点击回调 |
|
|
31
|
+
| backIconStyle | `any` | - | 返回按钮图标自定义样式 |
|
|
32
|
+
| isShowSearch | `boolean` | `false` | 是否显示搜索框 |
|
|
33
|
+
| searchPlaceholderText | `string` | - | 搜索框占位符文本 |
|
|
34
|
+
| searchOnChangeText | `(text: string) => void` | - | 搜索文本变化回调 |
|
|
35
|
+
| avatarSource | `string` | - | 头像图片 URI |
|
|
36
|
+
| avatarOnPress | `() => void` | - | 头像点击回调 |
|
|
37
|
+
| headerContainerStyle | `StyleProp<ViewStyle>` | - | 容器自定义样式 |
|
|
38
|
+
| theme | `any` | - | 主题对象(自动注入) |
|
|
39
|
+
|
|
40
|
+
> Header 继承 `@rneui/themed` 的 `HeaderProps`,支持所有 RNE Header 原生属性。
|
|
41
|
+
|
|
42
|
+
## 使用示例
|
|
43
|
+
|
|
44
|
+
### 基础标题
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
<Header title="Home" />
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 带返回按钮
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<Header
|
|
54
|
+
title="Order Details"
|
|
55
|
+
hasBack={true}
|
|
56
|
+
onLeftIconPress={() => navigation.goBack()}
|
|
57
|
+
/>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 带菜单按钮
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
<Header
|
|
64
|
+
title="Dashboard"
|
|
65
|
+
showLeftIcon={true}
|
|
66
|
+
leftIcon="menu"
|
|
67
|
+
onLeftIconPress={() => toggleNav()}
|
|
68
|
+
/>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 完整功能(搜索 + 头像)
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
<Header
|
|
75
|
+
title="Products"
|
|
76
|
+
showLeftIcon={true}
|
|
77
|
+
isShowSearch={true}
|
|
78
|
+
searchPlaceholderText="Search products..."
|
|
79
|
+
searchOnChangeText={(text) => handleSearch(text)}
|
|
80
|
+
avatarSource="https://randomuser.me/api/portraits/men/36.jpg"
|
|
81
|
+
avatarOnPress={() => alert('Avatar clicked')}
|
|
82
|
+
onLeftIconPress={() => alert('Menu clicked')}
|
|
83
|
+
/>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 自定义容器样式
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
<Header
|
|
90
|
+
title="Custom Styled Header"
|
|
91
|
+
hasBack={true}
|
|
92
|
+
onLeftIconPress={() => goBack()}
|
|
93
|
+
headerContainerStyle={{
|
|
94
|
+
backgroundColor: '#1a1a1a',
|
|
95
|
+
paddingHorizontal: 20,
|
|
96
|
+
}}
|
|
97
|
+
/>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 注意事项
|
|
101
|
+
|
|
102
|
+
- 页眉高度固定为 72px,背景色跟随主题 `theme.colors.background`
|
|
103
|
+
- 标题在桌面端使用 `h2` 字号和 `weightL` 字重,移动端使用 `h3` 字号
|
|
104
|
+
- `hasBack` 和 `showLeftIcon` 可同时设置,但通常二选一使用
|
|
105
|
+
- 桌面端标题占据整行(`flexGrow: 1`),自动省略号处理长文本
|
|
106
|
+
- 搜索框仅在 `isShowSearch=true` 时显示;桌面端为输入框,移动端为图标
|
|
107
|
+
- 搜索文本变化通过 `useEffect` 延迟触发 `searchOnChangeText` 回调
|
|
108
|
+
- 头像使用 `Avatar` 组件,大小为 `small`,圆形显示
|
|
109
|
+
- 左侧图标大小为 20px,颜色使用主题 `grey1`
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# HelloWave
|
|
2
|
+
|
|
3
|
+
挥手动画组件,使用 Animated API 实现简单的摆动效果,默认展示挥手 emoji。
|
|
4
|
+
|
|
5
|
+
## 安装使用
|
|
6
|
+
|
|
7
|
+
```tsx
|
|
8
|
+
import { HelloWave } from '@beppla/tapas-ui';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Props
|
|
12
|
+
|
|
13
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
14
|
+
|------|------|--------|------|
|
|
15
|
+
| emoji | `string` | `'👋'` | 显示的 emoji |
|
|
16
|
+
| duration | `number` | `150` | 单次摆动时长(毫秒) |
|
|
17
|
+
| repeatCount | `number` | `4` | 重复次数 |
|
|
18
|
+
| style | `any` | - | 容器样式 |
|
|
19
|
+
| textStyle | `any` | - | 文本样式 |
|
|
20
|
+
| testID | `string` | - | 测试标识 |
|
|
21
|
+
|
|
22
|
+
## 使用示例
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
<HelloWave />
|
|
26
|
+
|
|
27
|
+
<HelloWave emoji="🎉" duration={200} repeatCount={6} />
|
|
28
|
+
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","Hoverable","children","onHoverIn","onHoverOut","style","testID","isHovered","setIsHovered","useState","handleHoverIn","handleHoverOut","renderChildren","isValidElement","cloneElement","Platform","OS","jsx","onMouseEnter","onMouseLeave","View","_default","exports"],"sourceRoot":"../../../components","sources":["Hoverable/Hoverable.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAA8C,IAAAE,WAAA,GAAAF,OAAA;AAAA,SAAAD,wBAAAI,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAN,uBAAA,YAAAA,CAAAI,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAU9C,MAAMkB,SAAmC,GAAGA,CAAC;EAC3CC,QAAQ;EACRC,SAAS;EACTC,UAAU;EACVC,KAAK;EACLC;AACF,CAAC,KAAK;EACJ,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAG,IAAAC,eAAQ,EAAC,KAAK,CAAC;EAEjD,MAAMC,aAAa,GAAGA,CAAA,KAAM;IAC1BF,YAAY,CAAC,IAAI,CAAC;IAClBL,SAAS,GAAG,CAAC;EACf,CAAC;EAED,MAAMQ,cAAc,GAAGA,CAAA,KAAM;IAC3BH,YAAY,CAAC,KAAK,CAAC;IACnBJ,UAAU,GAAG,CAAC;EAChB,CAAC;EAED,MAAMQ,cAAc,GAAGA,CAAA,KAAM;IAC3B,IAAI,OAAOV,QAAQ,KAAK,UAAU,EAAE;MAClC,OAAOA,QAAQ,CAACK,SAAS,CAAC;IAC5B;IAEA,iBAAI,IAAAM,qBAAc,EAACX,QAAQ,CAAC,EAAE;MAC5B,oBAAO,IAAAY,mBAAY,EAACZ,QAAQ,
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","Hoverable","children","onHoverIn","onHoverOut","style","testID","isHovered","setIsHovered","useState","handleHoverIn","handleHoverOut","renderChildren","isValidElement","cloneElement","Platform","OS","jsx","onMouseEnter","onMouseLeave","View","_default","exports"],"sourceRoot":"../../../components","sources":["Hoverable/Hoverable.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAA8C,IAAAE,WAAA,GAAAF,OAAA;AAAA,SAAAD,wBAAAI,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAN,uBAAA,YAAAA,CAAAI,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAU9C,MAAMkB,SAAmC,GAAGA,CAAC;EAC3CC,QAAQ;EACRC,SAAS;EACTC,UAAU;EACVC,KAAK;EACLC;AACF,CAAC,KAAK;EACJ,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAG,IAAAC,eAAQ,EAAC,KAAK,CAAC;EAEjD,MAAMC,aAAa,GAAGA,CAAA,KAAM;IAC1BF,YAAY,CAAC,IAAI,CAAC;IAClBL,SAAS,GAAG,CAAC;EACf,CAAC;EAED,MAAMQ,cAAc,GAAGA,CAAA,KAAM;IAC3BH,YAAY,CAAC,KAAK,CAAC;IACnBJ,UAAU,GAAG,CAAC;EAChB,CAAC;EAED,MAAMQ,cAAc,GAAGA,CAAA,KAAM;IAC3B,IAAI,OAAOV,QAAQ,KAAK,UAAU,EAAE;MAClC,OAAOA,QAAQ,CAACK,SAAS,CAAC;IAC5B;IAEA,iBAAI,IAAAM,qBAAc,EAACX,QAAQ,CAAC,EAAE;MAC5B,oBAAO,IAAAY,mBAAY,EAACZ,QAAQ,EAA6B;QAAEK;MAAU,CAAC,CAAC;IACzE;IAEA,OAAOL,QAAQ;EACjB,CAAC;;EAED;EACA,IAAIa,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;IACzB,oBACE,IAAAnC,WAAA,CAAAoC,GAAA;MACEZ,KAAK,EAAEA,KAAM;MACba,YAAY,EAAER,aAAc;MAC5BS,YAAY,EAAER,cAAe;MAC7B,eAAaL,MAAO;MAAAJ,QAAA,EAEnBU,cAAc,CAAC;IAAC,CACd,CAAC;EAEV;;EAEA;EACA,oBACE,IAAA/B,WAAA,CAAAoC,GAAA,EAACrC,YAAA,CAAAwC,IAAI;IAACf,KAAK,EAAEA,KAAM;IAACC,MAAM,EAAEA,MAAO;IAAAJ,QAAA,EAChCU,cAAc,CAAC;EAAC,CACb,CAAC;AAEX,CAAC;AAAC,IAAAS,QAAA,GAAAC,OAAA,CAAA9B,OAAA,GAEaS,SAAS","ignoreList":[]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# IconText
|
|
2
|
+
|
|
3
|
+
图标文本组合组件,支持图标与文本的水平排列展示,可作为标签或可点击元素使用。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 图标 + 文本水平排列
|
|
8
|
+
- ✅ 两种类型:text(纯展示,外层 View)和 label(可点击,外层 TouchableOpacity)
|
|
9
|
+
- ✅ 三种尺寸:small (12px) / medium (14px) / large (16px)
|
|
10
|
+
- ✅ 自定义图标颜色(iconColor)
|
|
11
|
+
- ✅ 自定义背景颜色(backgroundColor)
|
|
12
|
+
- ✅ 文本截断控制(numberOfLines / ellipsizeMode)
|
|
13
|
+
- ✅ 自定义最大宽度(maxWidth)
|
|
14
|
+
- ✅ 支持 onLayout 事件回调
|
|
15
|
+
- ✅ 基于 @rneui/themed 主题系统
|
|
16
|
+
|
|
17
|
+
## 安装使用
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import IconText from '@beppla/tapas-ui/components/IconText/IconText';
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
26
|
+
|------|------|--------|------|
|
|
27
|
+
| title | `string` | (必填) | 文本内容 |
|
|
28
|
+
| icon | `string` | - | 图标名称(TapasIcon) |
|
|
29
|
+
| index | `number` | - | 索引值,作为 key |
|
|
30
|
+
| type | `'text' \| 'label'` | `'text'` | 类型:text 纯展示,label 可点击 |
|
|
31
|
+
| size | `'small' \| 'medium' \| 'large'` | `'medium'` | 尺寸 |
|
|
32
|
+
| style | `StyleProp<ViewStyle>` | - | 自定义容器样式 |
|
|
33
|
+
| titleStyle | `StyleProp<TextStyle>` | - | 自定义文本样式 |
|
|
34
|
+
| maxWidth | `number` | - | 最大宽度 |
|
|
35
|
+
| numberOfLines | `number` | - | 文本最大行数 |
|
|
36
|
+
| ellipsizeMode | `'head' \| 'middle' \| 'tail' \| 'clip'` | - | 文本截断模式 |
|
|
37
|
+
| onPress | `() => void` | - | 点击回调(仅 label 类型生效) |
|
|
38
|
+
| onLayout | `(e: any) => void` | - | 布局事件回调 |
|
|
39
|
+
| iconColor | `string` | 主题 secondary 色 | 图标颜色 |
|
|
40
|
+
| backgroundColor | `string` | 主题 grey5 色 | 背景颜色 |
|
|
41
|
+
|
|
42
|
+
## 使用示例
|
|
43
|
+
|
|
44
|
+
### 基础用法
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
<IconText title="示例文本" icon="home" />
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 不同尺寸
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<IconText title="小号" icon="info" size="small" />
|
|
54
|
+
<IconText title="中号" icon="info" size="medium" />
|
|
55
|
+
<IconText title="大号" icon="info" size="large" />
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 可点击标签
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
<IconText
|
|
62
|
+
title="点击我"
|
|
63
|
+
icon="star"
|
|
64
|
+
type="label"
|
|
65
|
+
onPress={() => console.log('Clicked')}
|
|
66
|
+
/>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 自定义颜色
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
<IconText
|
|
73
|
+
title="自定义颜色"
|
|
74
|
+
icon="warning"
|
|
75
|
+
iconColor="#FF6B00"
|
|
76
|
+
backgroundColor="#FFF3E0"
|
|
77
|
+
/>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 文本截断
|
|
81
|
+
|
|
82
|
+
```tsx
|
|
83
|
+
<IconText
|
|
84
|
+
title="这是一个很长的文本需要截断处理"
|
|
85
|
+
icon="info"
|
|
86
|
+
maxWidth={150}
|
|
87
|
+
numberOfLines={1}
|
|
88
|
+
ellipsizeMode="tail"
|
|
89
|
+
/>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 注意事项
|
|
93
|
+
|
|
94
|
+
- `type='text'` 时外层包裹 View 容器(带 grey5 背景),不可点击
|
|
95
|
+
- `type='label'` 时外层包裹 TouchableOpacity,可触发 onPress
|
|
96
|
+
- 不同尺寸对应不同的字号和图标大小:small (12px/12px)、medium (14px/16px)、large (16px/20px)
|
|
97
|
+
- 图标固定在文本左侧,间距为 4px
|
|
98
|
+
- 不传 `icon` 时只渲染文本部分
|
|
99
|
+
- 组件使用 `@rneui/themed` 主题系统,需在 ThemeProvider 内使用
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# PreviewImg
|
|
2
|
+
|
|
3
|
+
图片预览覆盖层组件,用于全屏展示图片集合,支持缩略图导航和前后切换。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 全屏图片预览
|
|
8
|
+
- ✅ 缩略图导航
|
|
9
|
+
- ✅ 前后切换功能
|
|
10
|
+
- ✅ 点击缩略图快速跳转
|
|
11
|
+
- ✅ 背景蒙层支持
|
|
12
|
+
- ✅ 响应式尺寸
|
|
13
|
+
|
|
14
|
+
## 安装使用
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
import PreviewImg from '@beppla/tapas-ui/components/Image/PreviewImg';
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Props
|
|
21
|
+
|
|
22
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
23
|
+
|------|------|--------|------|
|
|
24
|
+
| isVisible | boolean | false | 是否显示预览层 |
|
|
25
|
+
| data | IFileState[] | - | 图片数据数组 |
|
|
26
|
+
| defaultIndex | number | 0 | 默认显示的图片索引 |
|
|
27
|
+
| onClose | () => void | - | 关闭预览时的回调 |
|
|
28
|
+
| onSelect | (index: number) => void | - | 选择图片时的回调 |
|
|
29
|
+
|
|
30
|
+
## IFileState 结构
|
|
31
|
+
|
|
32
|
+
```tsx
|
|
33
|
+
interface IFileState {
|
|
34
|
+
fileId?: string;
|
|
35
|
+
fileName?: string;
|
|
36
|
+
fileUrl?: string;
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 使用示例
|
|
41
|
+
|
|
42
|
+
### 基础用法
|
|
43
|
+
```tsx
|
|
44
|
+
import PreviewImg from '@beppla/tapas-ui/components/Image/PreviewImg';
|
|
45
|
+
import { useState } from 'react';
|
|
46
|
+
|
|
47
|
+
export default function App() {
|
|
48
|
+
const [visible, setVisible] = useState(false);
|
|
49
|
+
|
|
50
|
+
const images = [
|
|
51
|
+
{ fileUrl: "https://example.com/image1.jpg", fileName: "Image 1" },
|
|
52
|
+
{ fileUrl: "https://example.com/image2.jpg", fileName: "Image 2" },
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<PreviewImg
|
|
57
|
+
isVisible={visible}
|
|
58
|
+
data={images}
|
|
59
|
+
onClose={() => setVisible(false)}
|
|
60
|
+
/>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 带选择回调
|
|
66
|
+
```tsx
|
|
67
|
+
<PreviewImg
|
|
68
|
+
isVisible={visible}
|
|
69
|
+
data={images}
|
|
70
|
+
defaultIndex={0}
|
|
71
|
+
onClose={() => setVisible(false)}
|
|
72
|
+
onSelect={(index) => {
|
|
73
|
+
console.log(`Selected image at index: ${index}`);
|
|
74
|
+
}}
|
|
75
|
+
/>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 多张图片预览
|
|
79
|
+
```tsx
|
|
80
|
+
const images = [
|
|
81
|
+
{ fileId: "1", fileUrl: "https://example.com/photo1.jpg", fileName: "Photo 1" },
|
|
82
|
+
{ fileId: "2", fileUrl: "https://example.com/photo2.jpg", fileName: "Photo 2" },
|
|
83
|
+
{ fileId: "3", fileUrl: "https://example.com/photo3.jpg", fileName: "Photo 3" },
|
|
84
|
+
];
|
|
85
|
+
|
|
86
|
+
<PreviewImg
|
|
87
|
+
isVisible={visible}
|
|
88
|
+
data={images}
|
|
89
|
+
defaultIndex={1}
|
|
90
|
+
onClose={() => setVisible(false)}
|
|
91
|
+
/>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 注意事项
|
|
95
|
+
|
|
96
|
+
- 单张图片时不显示前后导航按钮
|
|
97
|
+
- 点击背景蒙层会关闭预览
|
|
98
|
+
- 点击关闭按钮(X 图标)会关闭预览
|
|
99
|
+
- 缩略图边框颜色为橙色(#F55523)表示当前选中
|
|
100
|
+
- 仅支持 web 平台的 HTML img 标签
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# PreviewImg
|
|
2
|
+
|
|
3
|
+
图片预览组件,支持全屏遮罩层展示图片,提供缩略图列表导航和左右切换功能。适合商品图片、订单附件等多图预览场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 全屏遮罩层预览(Overlay)
|
|
8
|
+
- ✅ 多图浏览:底部缩略图列表导航
|
|
9
|
+
- ✅ 左右切换按钮(chevron_left / chevron_right)
|
|
10
|
+
- ✅ 首张/末张图片自动禁用对应切换按钮
|
|
11
|
+
- ✅ 点击缩略图快速跳转
|
|
12
|
+
- ✅ 当前选中缩略图高亮边框
|
|
13
|
+
- ✅ 点击遮罩或关闭按钮关闭预览
|
|
14
|
+
- ✅ 自定义默认展示图片索引(defaultIndex)
|
|
15
|
+
|
|
16
|
+
## 安装使用
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { PreviewImg } from '@beppla/tapas-ui';
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Props
|
|
23
|
+
|
|
24
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
25
|
+
|------|------|--------|------|
|
|
26
|
+
| isVisible | `boolean` | `false` | 是否显示预览 |
|
|
27
|
+
| data | `IFileState[]` | - | 图片数据数组(必填) |
|
|
28
|
+
| defaultIndex | `number` | `0` | 默认展示的图片索引 |
|
|
29
|
+
| onClose | `() => void` | - | 关闭回调(必填) |
|
|
30
|
+
| onSelect | `(index: number) => void` | - | 图片选择回调(预留) |
|
|
31
|
+
|
|
32
|
+
### IFileState
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
interface IFileState {
|
|
36
|
+
fileId?: string;
|
|
37
|
+
fileName?: string;
|
|
38
|
+
fileUrl?: string;
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 使用示例
|
|
43
|
+
|
|
44
|
+
### 基础用法
|
|
45
|
+
|
|
46
|
+
```tsx
|
|
47
|
+
const [visible, setVisible] = useState(false);
|
|
48
|
+
const images = [
|
|
49
|
+
{ fileId: '1', fileName: 'photo1.jpg', fileUrl: 'https://example.com/1.jpg' },
|
|
50
|
+
{ fileId: '2', fileName: 'photo2.jpg', fileUrl: 'https://example.com/2.jpg' },
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
<PreviewImg
|
|
54
|
+
isVisible={visible}
|
|
55
|
+
data={images}
|
|
56
|
+
onClose={() => setVisible(false)}
|
|
57
|
+
/>
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 指定默认图片
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
<PreviewImg
|
|
64
|
+
isVisible={visible}
|
|
65
|
+
data={images}
|
|
66
|
+
defaultIndex={2}
|
|
67
|
+
onClose={() => setVisible(false)}
|
|
68
|
+
/>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 单张图片(无切换按钮)
|
|
72
|
+
|
|
73
|
+
```tsx
|
|
74
|
+
<PreviewImg
|
|
75
|
+
isVisible={visible}
|
|
76
|
+
data={[{ fileUrl: 'https://example.com/single.jpg' }]}
|
|
77
|
+
onClose={() => setVisible(false)}
|
|
78
|
+
/>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 注意事项
|
|
82
|
+
|
|
83
|
+
- 组件使用 HTML `<img>` 标签渲染,仅适用于 Web 平台
|
|
84
|
+
- 主图高度自适应:`window.innerHeight - 200`
|
|
85
|
+
- 缩略图固定尺寸 84x84,选中态边框色 `#F55523`
|
|
86
|
+
- 单张图片时不显示左右切换按钮
|
|
87
|
+
- 预览层使用 `@rneui/themed` 的 Overlay 组件
|
|
88
|
+
- 需在 `ThemeProvider` 内使用
|