@fastspace/schema-form 0.0.7 → 0.0.9
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/README.md +121 -3
- package/dist/index.d.ts +4 -0
- package/dist/schema-form-lib.js +1023 -1013
- package/dist/schema-form-lib.umd.cjs +10 -10
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -97,6 +97,79 @@ function App() {
|
|
|
97
97
|
| `Switch` | 开关 | `boolean` |
|
|
98
98
|
| `Radio` | 单选组 | `string \| number` |
|
|
99
99
|
|
|
100
|
+
### 选项配置详解 (Select / Autocomplete)
|
|
101
|
+
|
|
102
|
+
`OptionItem` 结构支持以下属性:
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
type OptionItem = {
|
|
106
|
+
label: string; // 选中后输入框展示的文本
|
|
107
|
+
value: string | number | boolean | null; // 提交到表单的值
|
|
108
|
+
key?: string | number; // [可选] 唯一标识 (当 value 不唯一或 label 重复时使用)
|
|
109
|
+
listLabel?: React.ReactNode; // [可选] 下拉列表展示的内容 (可与 label 不一致)
|
|
110
|
+
disabled?: boolean; // 是否禁用
|
|
111
|
+
};
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
#### 场景 1:Label 重复导致 React Key 报错
|
|
115
|
+
如果选项中存在相同的 `label` 或 `value`,请显式提供 `key`:
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
{
|
|
119
|
+
label: '重复项',
|
|
120
|
+
value: 'dup_1',
|
|
121
|
+
key: 'unique_key_1'
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
label: '重复项',
|
|
125
|
+
value: 'dup_2',
|
|
126
|
+
key: 'unique_key_2'
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
#### 场景 2:列表展示与选中展示不一致
|
|
131
|
+
例如,列表中展示详细信息(如 "张三 (ID:001)"),选中后只展示姓名("张三"):
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
{
|
|
135
|
+
label: '张三', // 选中后展示
|
|
136
|
+
value: '001',
|
|
137
|
+
listLabel: ( // 列表中展示
|
|
138
|
+
<div>
|
|
139
|
+
<strong>张三</strong>
|
|
140
|
+
<span style={{ color: '#999', fontSize: 12 }}> (ID: 001)</span>
|
|
141
|
+
</div>
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
#### 场景 3:选中后触发额外操作
|
|
147
|
+
可以在 `fieldProps` 中传入 `onChange` 回调:
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
{
|
|
151
|
+
name: 'userSelect',
|
|
152
|
+
component: 'Select',
|
|
153
|
+
ui: {
|
|
154
|
+
label: '选择用户',
|
|
155
|
+
options: [
|
|
156
|
+
{ label: 'User A', value: 'a' },
|
|
157
|
+
{ label: 'User B', value: 'b' }
|
|
158
|
+
]
|
|
159
|
+
},
|
|
160
|
+
fieldProps: {
|
|
161
|
+
// 这里的 onChange 会在表单值更新后触发
|
|
162
|
+
onChange: (event, option) => {
|
|
163
|
+
console.log('选中项:', option);
|
|
164
|
+
// 执行额外逻辑,例如:
|
|
165
|
+
// 1. 调用接口获取详情
|
|
166
|
+
// 2. 联动更新其他字段 (通过 form 实例)
|
|
167
|
+
// 3. 弹窗提示
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
100
173
|
### 日期时间组件
|
|
101
174
|
|
|
102
175
|
| 组件名 | 说明 | 数据类型 |
|
|
@@ -804,11 +877,56 @@ const MyCustomInput = ({ field, form, values, label, error, helperText }) => {
|
|
|
804
877
|
|
|
805
878
|
---
|
|
806
879
|
|
|
807
|
-
##
|
|
880
|
+
## 自动完成 (Autocomplete)
|
|
881
|
+
|
|
882
|
+
`Autocomplete` 组件支持两种数据加载模式:**一次性加载**和**服务端搜索**。
|
|
883
|
+
|
|
884
|
+
### 1. 一次性加载 (Static / Async)
|
|
885
|
+
|
|
886
|
+
适用于数据量较小(如少于 1000 条),或者可以一次性加载所有选项的场景。
|
|
887
|
+
|
|
888
|
+
**用法:**
|
|
889
|
+
- **静态选项**:直接配置 `ui.options`。
|
|
890
|
+
- **异步加载**:配置 `ui.optionRequest`,组件挂载时(或依赖变化时)会自动执行一次请求。
|
|
891
|
+
|
|
892
|
+
**特点:**
|
|
893
|
+
- 前端过滤:组件内置了基于输入的本地过滤功能。
|
|
894
|
+
- 简单:无需处理分页、防抖等逻辑。
|
|
895
|
+
|
|
896
|
+
```typescript
|
|
897
|
+
// 示例:异步加载一次性数据
|
|
898
|
+
{
|
|
899
|
+
name: 'userId',
|
|
900
|
+
component: 'Autocomplete',
|
|
901
|
+
ui: {
|
|
902
|
+
label: '选择用户',
|
|
903
|
+
// 方式 A: 静态数据
|
|
904
|
+
// options: [{ label: '张三', value: 1 }, { label: '李四', value: 2 }],
|
|
905
|
+
|
|
906
|
+
// 方式 B: 异步一次性加载
|
|
907
|
+
optionRequest: async (values) => {
|
|
908
|
+
// 这里的 values 是当前表单的值,可用于联动
|
|
909
|
+
const users = await api.getAllUsers();
|
|
910
|
+
return users.map(u => ({ label: u.name, value: u.id }));
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
```
|
|
915
|
+
|
|
916
|
+
### 2. 服务端搜索 (Remote Search)
|
|
917
|
+
|
|
918
|
+
适用于数据量极大(如用户库、商品库),无法一次性加载,需要根据用户输入实时搜索的场景。
|
|
919
|
+
|
|
920
|
+
**用法:**
|
|
921
|
+
- 配置 `ui.remoteConfig`。
|
|
808
922
|
|
|
809
|
-
|
|
923
|
+
**特点:**
|
|
924
|
+
- 服务端过滤:每次输入都会发送请求给服务端。
|
|
925
|
+
- 支持分页:滚动到底部自动加载下一页。
|
|
926
|
+
- 支持防抖:内置防抖机制,减少请求频率。
|
|
927
|
+
- 支持回显:通过 `fetchById` 解决默认值不在当前列表中的问题。
|
|
810
928
|
|
|
811
|
-
|
|
929
|
+
> **注意**:如果配置了 `remoteConfig`,`ui.options` 和 `ui.optionRequest` 加载的数据将被忽略(除非作为初始值),组件将完全由 `remoteConfig` 接管数据流。
|
|
812
930
|
|
|
813
931
|
```typescript
|
|
814
932
|
{
|
package/dist/index.d.ts
CHANGED
|
@@ -321,6 +321,10 @@ export declare type OptionItem = {
|
|
|
321
321
|
label: string;
|
|
322
322
|
value: string | number | boolean | null;
|
|
323
323
|
disabled?: boolean;
|
|
324
|
+
/** 唯一标识 (解决 label 重复问题) */
|
|
325
|
+
key?: string | number;
|
|
326
|
+
/** 列表展示文本 (允许与选中后回显的 label 不一致) */
|
|
327
|
+
listLabel?: React.ReactNode;
|
|
324
328
|
[key: string]: unknown;
|
|
325
329
|
};
|
|
326
330
|
|