@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
|
+
# Navigation
|
|
2
|
+
|
|
3
|
+
侧边导航栏组件,提供可展开/折叠的垂直导航菜单。支持导航项(navItems)和系统项(systemItems)两层分组,收起时仅显示图标,展开时显示图标和文本。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- 可展开/折叠的侧边导航(收起 56px,展开 336px)
|
|
8
|
+
- 导航项和系统项两层分组(系统项固定在底部)
|
|
9
|
+
- 点击 Logo 切换展开/折叠状态
|
|
10
|
+
- 选中项高亮显示(展开时背景高亮,收起时图标高亮)
|
|
11
|
+
- 移动端支持背景遮罩层(点击遮罩关闭导航)
|
|
12
|
+
- 可配置权限信息(`permissions` 字段)
|
|
13
|
+
- 支持 `selectedIndex` 受控选中
|
|
14
|
+
- 可选集成 React Navigation 自动路由导航
|
|
15
|
+
- 自定义 Logo 图片
|
|
16
|
+
|
|
17
|
+
## 安装使用
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { Navigation, NavItem, NavItemType, SelectedItem } from '@beppla/tapas-ui';
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
26
|
+
|------|------|--------|------|
|
|
27
|
+
| navItems | `NavItem[]` | - | 导航项数组 |
|
|
28
|
+
| systemItems | `NavItem[]` | - | 系统项数组(显示在底部) |
|
|
29
|
+
| logoImg | `ImageSourcePropType` | - | Logo 图片资源 |
|
|
30
|
+
| expanded | `boolean` | `false` | 是否展开导航菜单 |
|
|
31
|
+
| onItemPress | `(item: NavItem) => void` | - | 导航项点击回调 |
|
|
32
|
+
| onLogoPress | `() => void` | - | Logo 点击回调 |
|
|
33
|
+
| defaultSelectedItem | `SelectedItem` | - | 默认选中项 |
|
|
34
|
+
| selectedIndex | `number` | - | 选中项索引(受控模式,仅匹配 navItems) |
|
|
35
|
+
| visible | `boolean` | `true` | 导航栏是否可见 |
|
|
36
|
+
| onMaskPress | `() => void` | - | 背景遮罩点击回调(移动端) |
|
|
37
|
+
| navigation | `{ navigate: (routeName: string, params?: any) => void }` | - | React Navigation 对象(可选) |
|
|
38
|
+
|
|
39
|
+
## 类型定义
|
|
40
|
+
|
|
41
|
+
### NavItem
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
interface NavItem {
|
|
45
|
+
name: string; // 项目名称(展开时显示)
|
|
46
|
+
iconName: string; // TapasIcon 图标名称
|
|
47
|
+
url?: string; // 链接 URL(可选)
|
|
48
|
+
permissions?: Permissions[]; // 权限要求(可选)
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Permissions
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
interface Permissions {
|
|
56
|
+
resource: string; // 资源名
|
|
57
|
+
action: string; // 操作名
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### NavItemType / SelectedItem
|
|
62
|
+
|
|
63
|
+
```tsx
|
|
64
|
+
enum NavItemType {
|
|
65
|
+
Nav = 'nav', // 导航项
|
|
66
|
+
System = 'system', // 系统项
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
interface SelectedItem {
|
|
70
|
+
type: NavItemType; // 项目类型
|
|
71
|
+
selectedItemIndex: number; // 项目索引
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 使用示例
|
|
76
|
+
|
|
77
|
+
### 基础导航
|
|
78
|
+
|
|
79
|
+
```tsx
|
|
80
|
+
import { Navigation, NavItem, NavItemType } from '@beppla/tapas-ui';
|
|
81
|
+
|
|
82
|
+
const navItems: NavItem[] = [
|
|
83
|
+
{ name: 'Dashboard', iconName: 'home' },
|
|
84
|
+
{ name: 'Analytics', iconName: 'vector' },
|
|
85
|
+
{ name: 'Products', iconName: 'product_items' },
|
|
86
|
+
{ name: 'Messages', iconName: 'chat' },
|
|
87
|
+
];
|
|
88
|
+
|
|
89
|
+
const systemItems: NavItem[] = [
|
|
90
|
+
{ name: 'Settings', iconName: 'settings' },
|
|
91
|
+
{ name: 'Refresh', iconName: 'refresh' },
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
export default function App() {
|
|
95
|
+
return (
|
|
96
|
+
<Navigation
|
|
97
|
+
navItems={navItems}
|
|
98
|
+
systemItems={systemItems}
|
|
99
|
+
logoImg={require('./logo.png')}
|
|
100
|
+
defaultSelectedItem={{
|
|
101
|
+
type: NavItemType.Nav,
|
|
102
|
+
selectedItemIndex: 0,
|
|
103
|
+
}}
|
|
104
|
+
/>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 带点击回调
|
|
110
|
+
|
|
111
|
+
```tsx
|
|
112
|
+
<Navigation
|
|
113
|
+
navItems={navItems}
|
|
114
|
+
systemItems={systemItems}
|
|
115
|
+
logoImg={require('./logo.png')}
|
|
116
|
+
onItemPress={(item) => {
|
|
117
|
+
console.log('Selected:', item.name);
|
|
118
|
+
setCurrentPage(item.name);
|
|
119
|
+
}}
|
|
120
|
+
/>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 受控选中索引
|
|
124
|
+
|
|
125
|
+
```tsx
|
|
126
|
+
const [selectedIdx, setSelectedIdx] = useState(0);
|
|
127
|
+
|
|
128
|
+
<Navigation
|
|
129
|
+
navItems={navItems}
|
|
130
|
+
systemItems={systemItems}
|
|
131
|
+
logoImg={require('./logo.png')}
|
|
132
|
+
selectedIndex={selectedIdx}
|
|
133
|
+
onItemPress={(item) => {
|
|
134
|
+
const idx = navItems.findIndex(n => n.name === item.name);
|
|
135
|
+
if (idx >= 0) setSelectedIdx(idx);
|
|
136
|
+
}}
|
|
137
|
+
/>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 与 React Navigation 集成
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
import { useNavigation } from '@react-navigation/native';
|
|
144
|
+
|
|
145
|
+
const navigation = useNavigation();
|
|
146
|
+
|
|
147
|
+
<Navigation
|
|
148
|
+
navItems={[
|
|
149
|
+
{ name: 'Home', iconName: 'home' },
|
|
150
|
+
{ name: 'Details', iconName: 'info' },
|
|
151
|
+
]}
|
|
152
|
+
logoImg={require('./logo.png')}
|
|
153
|
+
navigation={navigation}
|
|
154
|
+
/>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 完整布局示例
|
|
158
|
+
|
|
159
|
+
```tsx
|
|
160
|
+
import { View, Text } from 'react-native';
|
|
161
|
+
import { Navigation, NavItem } from '@beppla/tapas-ui';
|
|
162
|
+
import { useState } from 'react';
|
|
163
|
+
|
|
164
|
+
const navItems: NavItem[] = [
|
|
165
|
+
{ name: 'Dashboard', iconName: 'home' },
|
|
166
|
+
{ name: 'Products', iconName: 'product_items' },
|
|
167
|
+
{ name: 'Orders', iconName: 'manufacturing' },
|
|
168
|
+
];
|
|
169
|
+
|
|
170
|
+
export default function App() {
|
|
171
|
+
const [page, setPage] = useState('Dashboard');
|
|
172
|
+
|
|
173
|
+
return (
|
|
174
|
+
<View style={{ flexDirection: 'row', height: '100%' }}>
|
|
175
|
+
<Navigation
|
|
176
|
+
navItems={navItems}
|
|
177
|
+
logoImg={require('./logo.png')}
|
|
178
|
+
onItemPress={(item) => setPage(item.name)}
|
|
179
|
+
/>
|
|
180
|
+
<View style={{ flex: 1, padding: 16 }}>
|
|
181
|
+
<Text>{page} Content</Text>
|
|
182
|
+
</View>
|
|
183
|
+
</View>
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## 注意事项
|
|
189
|
+
|
|
190
|
+
- 导航栏默认收起状态(宽度 56px),点击 Logo 切换展开(336px)/折叠
|
|
191
|
+
- 桌面端点击 Logo 触发 `onLogoPress` 并切换展开状态;移动端点击 Logo 触发 `onMaskPress`
|
|
192
|
+
- 展开时会在导航栏外显示半透明遮罩层(`rgba(0,0,0,0.5)`),点击遮罩可关闭
|
|
193
|
+
- `selectedIndex` 仅匹配 `navItems` 数组,不支持直接选中 `systemItems`
|
|
194
|
+
- 设置 `navigation` 属性后,点击导航项会自动调用 `navigation.navigate(item.name)`
|
|
195
|
+
- 导航项图标大小固定 20px,颜色为主题 `white`
|
|
196
|
+
- 选中状态:展开时背景高亮(`secondary` 色),收起时图标容器高亮
|
|
197
|
+
- `visible=false` 时整个导航栏不渲染
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# NumericInput
|
|
2
|
+
|
|
3
|
+
数字输入组件,包含加减按钮和文本输入框,适用于数量选择场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 加减按钮控制数值增减
|
|
8
|
+
- ✅ 支持手动键盘输入数字
|
|
9
|
+
- ✅ 可设置最大值和最小值限制
|
|
10
|
+
- ✅ 到达边界时自动禁用对应按钮
|
|
11
|
+
- ✅ 支持整体禁用状态
|
|
12
|
+
- ✅ 加号按钮使用主题色填充背景
|
|
13
|
+
- ✅ 支持 onReduce 和 onAdd 额外回调
|
|
14
|
+
- ✅ 兼容 RN 0.77 Bridgeless 模式(Android 焦点管理修复)
|
|
15
|
+
- ✅ 支持自定义输入框样式
|
|
16
|
+
- ✅ 支持 testID 属性用于测试
|
|
17
|
+
|
|
18
|
+
## 安装使用
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import NumericInput from '@beppla/tapas-ui/components/NumericInput/NumericInput';
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Props
|
|
25
|
+
|
|
26
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
27
|
+
|------|------|--------|------|
|
|
28
|
+
| value | `number` | - | 当前数值 |
|
|
29
|
+
| max | `number` | - | 最大值 |
|
|
30
|
+
| min | `number` | - | 最小值 |
|
|
31
|
+
| onChange | `(value: number) => void` | - | 数值变化回调 |
|
|
32
|
+
| onReduce | `() => void` | - | 减少按钮点击回调(在数值变化前触发) |
|
|
33
|
+
| onAdd | `() => void` | - | 增加按钮点击回调(在数值变化前触发) |
|
|
34
|
+
| disabled | `boolean` | - | 是否禁用整个组件 |
|
|
35
|
+
| inputStyle | `StyleProp<ViewStyle>` | - | 输入框自定义样式 |
|
|
36
|
+
| testID | `string` | - | 测试标识 |
|
|
37
|
+
| enableBridgelessFix | `boolean` | `true` | 是否启用 RN 0.77 Bridgeless 模式兼容修复 |
|
|
38
|
+
|
|
39
|
+
## 使用示例
|
|
40
|
+
|
|
41
|
+
### 基础用法
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
<NumericInput
|
|
45
|
+
value={0}
|
|
46
|
+
min={0}
|
|
47
|
+
max={99}
|
|
48
|
+
onChange={(value) => console.log('数量:', value)}
|
|
49
|
+
/>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 设置范围
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
<NumericInput
|
|
56
|
+
value={5}
|
|
57
|
+
min={1}
|
|
58
|
+
max={10}
|
|
59
|
+
onChange={(value) => setQuantity(value)}
|
|
60
|
+
/>
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### 禁用状态
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
<NumericInput
|
|
67
|
+
value={3}
|
|
68
|
+
min={0}
|
|
69
|
+
max={99}
|
|
70
|
+
disabled
|
|
71
|
+
onChange={() => {}}
|
|
72
|
+
/>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 带额外回调
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
<NumericInput
|
|
79
|
+
value={count}
|
|
80
|
+
min={0}
|
|
81
|
+
max={99}
|
|
82
|
+
onChange={(value) => setCount(value)}
|
|
83
|
+
onAdd={() => console.log('点击了增加')}
|
|
84
|
+
onReduce={() => console.log('点击了减少')}
|
|
85
|
+
/>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 注意事项
|
|
89
|
+
|
|
90
|
+
- `onReduce` 和 `onAdd` 在按钮点击时立即触发,即使数值已到边界也会触发
|
|
91
|
+
- `onChange` 只在数值实际变化时触发(边界处不触发)
|
|
92
|
+
- 手动输入时,超过 `max` 的值会被忽略
|
|
93
|
+
- 失焦时会触发 `onChange` 回调,Android 上有延迟处理以兼容 Bridgeless 模式
|
|
94
|
+
- 组件最小宽度 136px,高度 40px
|
|
95
|
+
- 如果 Android 上遇到焦点问题,可设置 `enableBridgelessFix={false}` 尝试
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Overlay
|
|
2
|
+
|
|
3
|
+
覆盖层组件,基于 `@rneui/themed` 的 Overlay 封装,用于显示底部弹出的模态内容面板。预设从底部弹出、占屏幕 80% 高度的样式,适合底部 Sheet 和弹出菜单场景。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 继承 @rneui/themed OverlayProps 的全部能力
|
|
8
|
+
- ✅ 预设底部弹出样式(absolute + bottom: 0)
|
|
9
|
+
- ✅ 半透明遮罩背景(backdropStyle)
|
|
10
|
+
- ✅ 支持点击遮罩关闭(onBackdropPress)
|
|
11
|
+
- ✅ 自定义 overlayStyle 和 backdropStyle 覆盖默认样式
|
|
12
|
+
- ✅ 主题色适配
|
|
13
|
+
|
|
14
|
+
## 安装使用
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
import { Overlay } from '@beppla/tapas-ui';
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Props
|
|
21
|
+
|
|
22
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
23
|
+
|------|------|--------|------|
|
|
24
|
+
| isVisible | `boolean` | - | 是否显示覆盖层(必填) |
|
|
25
|
+
| onBackdropPress | `() => void` | - | 点击遮罩回调 |
|
|
26
|
+
| overlayStyle | `StyleProp<ViewStyle>` | 底部弹出,宽100%,高80% | 覆盖层样式 |
|
|
27
|
+
| backdropStyle | `StyleProp<ViewStyle>` | 半透明灰色 | 遮罩样式 |
|
|
28
|
+
| children | `React.ReactNode` | - | 覆盖层内容 |
|
|
29
|
+
|
|
30
|
+
> 继承 `@rneui/themed` OverlayProps 的所有属性
|
|
31
|
+
|
|
32
|
+
## 使用示例
|
|
33
|
+
|
|
34
|
+
### 基础用法
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
const [isVisible, setIsVisible] = useState(false);
|
|
38
|
+
|
|
39
|
+
<Button onPress={() => setIsVisible(true)}>Open Overlay</Button>
|
|
40
|
+
<Overlay
|
|
41
|
+
isVisible={isVisible}
|
|
42
|
+
onBackdropPress={() => setIsVisible(false)}
|
|
43
|
+
>
|
|
44
|
+
<View>
|
|
45
|
+
<Text>Overlay Content</Text>
|
|
46
|
+
</View>
|
|
47
|
+
</Overlay>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 自定义高度
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<Overlay
|
|
54
|
+
isVisible={isVisible}
|
|
55
|
+
onBackdropPress={() => setIsVisible(false)}
|
|
56
|
+
overlayStyle={{ height: '50%' }}
|
|
57
|
+
>
|
|
58
|
+
<Text>Half screen overlay</Text>
|
|
59
|
+
</Overlay>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 居中弹出
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
<Overlay
|
|
66
|
+
isVisible={isVisible}
|
|
67
|
+
onBackdropPress={() => setIsVisible(false)}
|
|
68
|
+
overlayStyle={{
|
|
69
|
+
width: '80%',
|
|
70
|
+
height: 'auto',
|
|
71
|
+
position: 'relative',
|
|
72
|
+
borderRadius: 12,
|
|
73
|
+
}}
|
|
74
|
+
>
|
|
75
|
+
<Text>Centered modal content</Text>
|
|
76
|
+
</Overlay>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 注意事项
|
|
80
|
+
|
|
81
|
+
- 默认样式为底部弹出面板(`position: absolute, bottom: 0, width: 100%, height: 80%`)
|
|
82
|
+
- 传入 `overlayStyle` 会与默认样式合并(数组形式),后者优先级更高
|
|
83
|
+
- 组件需在 `ThemeProvider` 内使用
|
|
84
|
+
- 遮罩背景色使用主题的 `grey4` 颜色
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Pagination
|
|
2
|
+
|
|
3
|
+
分页组件,用于大数据列表的分页导航。支持页码选择、每页条数切换、分组翻页和总数展示,适配桌面和移动端。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- ✅ 页码分组展示(每组 5 页),前后翻组
|
|
8
|
+
- ✅ 当前页高亮(圆形选中样式)
|
|
9
|
+
- ✅ 每页条数下拉选择(Dropdown 集成)
|
|
10
|
+
- ✅ 总数显示(可选隐藏)
|
|
11
|
+
- ✅ 移动端自适应:默认隐藏总数和每页条数选择
|
|
12
|
+
- ✅ 自定义每页条数选项(pageSizeOptions)
|
|
13
|
+
- ✅ 自定义容器样式和背景色
|
|
14
|
+
- ✅ 下拉框位置和宽度可配置
|
|
15
|
+
- ✅ 无障碍支持(accessibilityRole / accessibilityLabel)
|
|
16
|
+
|
|
17
|
+
## 安装使用
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { Pagination } from '@beppla/tapas-ui';
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
26
|
+
|------|------|--------|------|
|
|
27
|
+
| totalCount | `string` | - | 总数显示文本(必填) |
|
|
28
|
+
| pageParams | `TPageParams` | `{ page: 1, pageSize: 10, totalItems: 0, totalPage: 1 }` | 分页参数 |
|
|
29
|
+
| pageSizeOptions | `ItemProps[]` | `[1, 5, 10, 20, 50, 100]/Page` | 每页条数选项 |
|
|
30
|
+
| visibleTotalCount | `boolean` | 桌面端 `true`,移动端 `false` | 是否显示总数 |
|
|
31
|
+
| visiblePageSizeOptions | `boolean` | 桌面端 `true`,移动端 `false` | 是否显示每页条数选择 |
|
|
32
|
+
| onPageChange | `(page: TPageParams) => void` | - | 页码变化回调 |
|
|
33
|
+
| onPageSizeChange | `(item: ItemProps) => void` | - | 每页条数变化回调 |
|
|
34
|
+
| paginationContainerStyle | `StyleProp<ViewStyle>` | - | 容器样式 |
|
|
35
|
+
| pageSizePosition | `TDropdownPosition` | `'auto'` | 下拉框弹出位置 |
|
|
36
|
+
| backgroundColor | `string` | - | 背景色 |
|
|
37
|
+
| pageSizeDropdownWidth | `number` | 自动计算 | 下拉框宽度 |
|
|
38
|
+
|
|
39
|
+
### TPageParams
|
|
40
|
+
|
|
41
|
+
```tsx
|
|
42
|
+
type TPageParams = {
|
|
43
|
+
page: number; // 当前页码
|
|
44
|
+
pageSize: number; // 每页条数
|
|
45
|
+
totalItems: number; // 总条数
|
|
46
|
+
totalPage: number; // 总页数
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 使用示例
|
|
51
|
+
|
|
52
|
+
### 基础用法
|
|
53
|
+
|
|
54
|
+
```tsx
|
|
55
|
+
<Pagination
|
|
56
|
+
totalCount="100 items"
|
|
57
|
+
pageParams={{
|
|
58
|
+
page: 1,
|
|
59
|
+
pageSize: 10,
|
|
60
|
+
totalItems: 100,
|
|
61
|
+
totalPage: 10,
|
|
62
|
+
}}
|
|
63
|
+
onPageChange={(params) => {
|
|
64
|
+
fetchData(params.page, params.pageSize);
|
|
65
|
+
}}
|
|
66
|
+
/>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 自定义每页条数
|
|
70
|
+
|
|
71
|
+
```tsx
|
|
72
|
+
<Pagination
|
|
73
|
+
totalCount="500 records"
|
|
74
|
+
pageParams={pageParams}
|
|
75
|
+
pageSizeOptions={[
|
|
76
|
+
{ name: '25/Page', value: 25 },
|
|
77
|
+
{ name: '50/Page', value: 50 },
|
|
78
|
+
{ name: '100/Page', value: 100 },
|
|
79
|
+
]}
|
|
80
|
+
onPageChange={handlePageChange}
|
|
81
|
+
onPageSizeChange={(item) => {
|
|
82
|
+
setPageSize(item.value);
|
|
83
|
+
}}
|
|
84
|
+
/>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### 隐藏总数和条数选择
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
<Pagination
|
|
91
|
+
totalCount=""
|
|
92
|
+
pageParams={pageParams}
|
|
93
|
+
visibleTotalCount={false}
|
|
94
|
+
visiblePageSizeOptions={false}
|
|
95
|
+
onPageChange={handlePageChange}
|
|
96
|
+
/>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 注意事项
|
|
100
|
+
|
|
101
|
+
- 页码分组为每组 5 页,通过左右箭头翻组
|
|
102
|
+
- `pageParams` 变化会自动同步内部状态
|
|
103
|
+
- 移动端自动隐藏总数和每页条数选择器
|
|
104
|
+
- 下拉框宽度默认根据最长选项文本自动计算(最小 140px,最大 200px)
|
|
105
|
+
- 组件使用 `React.memo` 优化渲染
|
|
106
|
+
- 下拉框基于 Dropdown 组件实现
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# PieChart / NestedPieChart
|
|
2
|
+
|
|
3
|
+
饼图组件,包含基础饼图(PieChart)和嵌套饼图(NestedPieChart)两个组件。支持饼图、环形图(Donut)、多层级嵌套等展示方式。采用**双平台渲染**策略:Web 端使用 recharts,Native 端使用 react-native-svg-charts。
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
### PieChart
|
|
8
|
+
- ✅ **双平台渲染**:Web 使用 recharts,Native 使用 react-native-svg-charts
|
|
9
|
+
- ✅ 支持饼图和环形图(通过 innerRadius 控制)
|
|
10
|
+
- ✅ 图例支持 top / bottom / left / right 四个位置
|
|
11
|
+
- ✅ 图例可显示数值,支持 left / right 对齐
|
|
12
|
+
- ✅ 自定义图例间距:行间距(legendItemGap)、Label-Value 间距(legendLabelValueGap)
|
|
13
|
+
- ✅ Label 最小宽度控制(legendLabelMinWidth),确保数值列对齐
|
|
14
|
+
- ✅ 饼图与图例间距可调(legendChartGap,左右位置时生效)
|
|
15
|
+
- ✅ 自定义外圆/内圆半径,支持数字(像素)和字符串(百分比)
|
|
16
|
+
- ✅ 支持扇区标签显示和中心文字
|
|
17
|
+
- ✅ 长图例列表自动滚动(Native 端 ScrollView)
|
|
18
|
+
|
|
19
|
+
### NestedPieChart
|
|
20
|
+
- ✅ 支持多层级嵌套饼图(仅 Web 平台)
|
|
21
|
+
- ✅ 树形数据结构和扁平数据结构,支持自动推断
|
|
22
|
+
- ✅ 分组图例(grouped legend),可折叠展开
|
|
23
|
+
- ✅ 自动配色策略(渐变色阶,baseColors 映射)
|
|
24
|
+
- ✅ 扇区点击/悬停、图例点击事件
|
|
25
|
+
- ✅ 图例过滤(enableLegendFilter)
|
|
26
|
+
- ✅ 自定义 Tooltip
|
|
27
|
+
- ✅ 格式化函数(数值 / 百分比)
|
|
28
|
+
|
|
29
|
+
## 安装使用
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { PieChart } from '@beppla/tapas-ui/components/PieChart';
|
|
33
|
+
import { NestedPieChart } from '@beppla/tapas-ui/components/PieChart';
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## PieChart Props
|
|
37
|
+
|
|
38
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
39
|
+
|------|------|--------|------|
|
|
40
|
+
| data | `PieChartData[]` | (必填) | 饼图数据 |
|
|
41
|
+
| width | `number` | - | 图表宽度 |
|
|
42
|
+
| height | `number` | `300` | 图表高度 |
|
|
43
|
+
| colors | `string[]` | 默认 6 色 | 颜色方案 |
|
|
44
|
+
| outerRadius | `number \| string` | 自动计算 | 外圆半径,支持像素和百分比(如 `'80%'`) |
|
|
45
|
+
| innerRadius | `number \| string` | `0` | 内圆半径,设置后变为环形图 |
|
|
46
|
+
| padAngle | `number` | `0.02` | 扇区间隔角度 |
|
|
47
|
+
| showLabels | `boolean` | `false` | 是否在扇区上显示标签 |
|
|
48
|
+
| showLegend | `boolean` | `true` | 是否显示图例 |
|
|
49
|
+
| legendPosition | `'top' \| 'bottom' \| 'left' \| 'right'` | `'right'` | 图例位置 |
|
|
50
|
+
| showLegendValues | `boolean` | `true` | 图例是否显示数值 |
|
|
51
|
+
| legendValueAlign | `'left' \| 'right'` | `'right'` | 图例数值对齐方式 |
|
|
52
|
+
| legendItemGap | `number` | `8` | 图例行间距(px) |
|
|
53
|
+
| legendLabelValueGap | `number` | `12` | Label 与 Value 间距(px) |
|
|
54
|
+
| legendLabelMinWidth | `number` | - | Label 最小宽度,确保对齐 |
|
|
55
|
+
| legendChartGap | `number` | `30` | 饼图与图例间距(左右位置时生效) |
|
|
56
|
+
| centerText | `string` | - | 中心文字(环形图) |
|
|
57
|
+
| style | `any` | - | 容器样式 |
|
|
58
|
+
| testID | `string` | - | 测试标识 |
|
|
59
|
+
|
|
60
|
+
### PieChartData
|
|
61
|
+
|
|
62
|
+
| 属性 | 类型 | 说明 |
|
|
63
|
+
|------|------|------|
|
|
64
|
+
| value | `number` | 数值(必填) |
|
|
65
|
+
| label | `string` | 标签 |
|
|
66
|
+
| color | `string` | 自定义颜色(优先级高于 colors 数组) |
|
|
67
|
+
| key | `string \| number` | 唯一标识 |
|
|
68
|
+
|
|
69
|
+
## NestedPieChart Props
|
|
70
|
+
|
|
71
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
72
|
+
|------|------|--------|------|
|
|
73
|
+
| data | `NestedPieChartNode[] \| NestedPieChartFlatData[]` | (必填) | 嵌套数据 |
|
|
74
|
+
| dataType | `'tree' \| 'flat'` | 自动推断 | 数据类型 |
|
|
75
|
+
| levels | `number` | 自动计算 | 显示层数 |
|
|
76
|
+
| width | `number` | - | 图表宽度 |
|
|
77
|
+
| height | `number` | - | 图表高度 |
|
|
78
|
+
| outerRadius | `number \| string` | - | 外圆半径 |
|
|
79
|
+
| innerRadius | `number \| string` | - | 最内层半径 |
|
|
80
|
+
| radiusGap | `number` | `10` | 层间间隔 |
|
|
81
|
+
| colorStrategy | `ColorStrategy` | - | 配色策略(baseColors、autoGenerate、colorSteps) |
|
|
82
|
+
| colors | `string[]` | - | 默认配色数组 |
|
|
83
|
+
| showLegend | `boolean` | - | 是否显示图例 |
|
|
84
|
+
| legendMode | `'flat' \| 'grouped'` | - | 图例模式 |
|
|
85
|
+
| legendPosition | `'top' \| 'bottom' \| 'left' \| 'right'` | - | 图例位置 |
|
|
86
|
+
| legendContent | `'all' \| 'parent-only' \| 'children-only'` | - | 图例显示内容 |
|
|
87
|
+
| legendCollapsible | `boolean` | - | 图例是否可折叠 |
|
|
88
|
+
| legendDefaultExpanded | `boolean` | - | 图例默认展开 |
|
|
89
|
+
| legendSortStrategy | `'none' \| 'value-desc' \| 'value-asc' \| 'label-asc' \| 'label-desc'` | - | 图例排序策略 |
|
|
90
|
+
| legendGroupSortStrategy | `LegendSortStrategy` | - | 分组排序策略 |
|
|
91
|
+
| legendShowValues | `boolean` | - | 是否显示数值 |
|
|
92
|
+
| legendShowPercent | `boolean` | - | 是否显示百分比 |
|
|
93
|
+
| legendItemGap | `number` | - | 图例项间距 |
|
|
94
|
+
| legendGroupGap | `number` | - | 分组间距 |
|
|
95
|
+
| legendLabelMinWidth | `number` | - | Label 最小宽度 |
|
|
96
|
+
| legendChartGap | `number` | - | 饼图与图例间距 |
|
|
97
|
+
| showLabels | `boolean` | - | 是否显示扇区标签 |
|
|
98
|
+
| labelLevel | `'all' \| number` | - | 显示标签的层级 |
|
|
99
|
+
| formatValue | `(value: number) => string` | - | 数值格式化 |
|
|
100
|
+
| formatPercent | `(percent: number) => string` | - | 百分比格式化 |
|
|
101
|
+
| onSliceClick | `(event: SliceClickEvent) => void` | - | 扇区点击 |
|
|
102
|
+
| onSliceHover | `(event: SliceClickEvent \| null) => void` | - | 扇区悬停 |
|
|
103
|
+
| onLegendClick | `(event: LegendClickEvent) => void` | - | 图例点击 |
|
|
104
|
+
| enableLegendFilter | `boolean` | - | 点击图例过滤扇区 |
|
|
105
|
+
| showTooltip | `boolean` | - | 是否显示 Tooltip |
|
|
106
|
+
| customTooltip | `(event: SliceClickEvent) => ReactNode` | - | 自定义 Tooltip |
|
|
107
|
+
| padAngle | `number` | - | 扇区间隔角度 |
|
|
108
|
+
| centerText | `string` | - | 中心文字 |
|
|
109
|
+
| centerTextStyle | `React.CSSProperties` | - | 中心文字样式 |
|
|
110
|
+
| emptyText | `string` | - | 空数据文本 |
|
|
111
|
+
| style | `any` | - | 容器样式 |
|
|
112
|
+
| testID | `string` | - | 测试标识 |
|
|
113
|
+
|
|
114
|
+
## 使用示例
|
|
115
|
+
|
|
116
|
+
### 基础饼图
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
<PieChart
|
|
120
|
+
data={[
|
|
121
|
+
{ value: 40, label: 'Category A', color: '#FF6B00' },
|
|
122
|
+
{ value: 30, label: 'Category B', color: '#0066CC' },
|
|
123
|
+
{ value: 20, label: 'Category C', color: '#00B894' },
|
|
124
|
+
{ value: 10, label: 'Category D', color: '#6C5CE7' },
|
|
125
|
+
]}
|
|
126
|
+
height={300}
|
|
127
|
+
/>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 环形图(Donut Chart)
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
<PieChart
|
|
134
|
+
data={sampleData}
|
|
135
|
+
innerRadius="50%"
|
|
136
|
+
centerText="Total"
|
|
137
|
+
/>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 自定义饼图大小
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
<PieChart data={sampleData} outerRadius={100} height={300} />
|
|
144
|
+
<PieChart data={sampleData} outerRadius="80%" height={350} />
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 图例配置
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
<PieChart
|
|
151
|
+
data={sampleData}
|
|
152
|
+
legendPosition="right"
|
|
153
|
+
showLegendValues
|
|
154
|
+
legendValueAlign="right"
|
|
155
|
+
legendItemGap={12}
|
|
156
|
+
legendLabelValueGap={20}
|
|
157
|
+
legendLabelMinWidth={200}
|
|
158
|
+
legendChartGap={48}
|
|
159
|
+
/>
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### NestedPieChart 嵌套饼图
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
<NestedPieChart
|
|
166
|
+
data={[
|
|
167
|
+
{
|
|
168
|
+
key: 'food',
|
|
169
|
+
label: 'Food',
|
|
170
|
+
children: [
|
|
171
|
+
{ key: 'rice', label: 'Rice', value: 30 },
|
|
172
|
+
{ key: 'noodle', label: 'Noodle', value: 20 },
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
key: 'drink',
|
|
177
|
+
label: 'Drink',
|
|
178
|
+
children: [
|
|
179
|
+
{ key: 'coffee', label: 'Coffee', value: 25 },
|
|
180
|
+
{ key: 'tea', label: 'Tea', value: 15 },
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
]}
|
|
184
|
+
showLegend
|
|
185
|
+
legendMode="grouped"
|
|
186
|
+
legendCollapsible
|
|
187
|
+
/>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 自定义配色
|
|
191
|
+
|
|
192
|
+
```tsx
|
|
193
|
+
<NestedPieChart
|
|
194
|
+
data={nestedData}
|
|
195
|
+
colorStrategy={{
|
|
196
|
+
baseColors: { cash: '#00B894', card: '#FF6B00' },
|
|
197
|
+
autoGenerate: true,
|
|
198
|
+
}}
|
|
199
|
+
height={450}
|
|
200
|
+
/>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
## 注意事项
|
|
204
|
+
|
|
205
|
+
- **PieChart 双平台渲染**:Web 端使用 recharts(功能完整),Native 端使用 react-native-svg-charts(功能受限)
|
|
206
|
+
- **NestedPieChart 仅支持 Web 平台**,Native 端会显示降级提示
|
|
207
|
+
- `innerRadius` 设置为大于 0 的值即变为环形图
|
|
208
|
+
- `outerRadius` 支持数字(像素)和字符串(百分比如 `'80%'`)
|
|
209
|
+
- `legendChartGap` 仅在图例位于 left / right 时生效
|
|
210
|
+
- `legendLabelMinWidth` 可确保不同长度标签的数值列对齐
|
|
211
|
+
- Native 端图例使用 ScrollView 实现长列表滚动
|
|
212
|
+
- 需安装对应平台依赖:Web 需要 `recharts`,Native 需要 `react-native-svg-charts` + `react-native-svg`
|