@ticatec/uniface-element 0.2.0 → 0.2.2
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 +320 -1
- package/README_CN.md +392 -0
- package/dist/accordion/Accordion.svelte +1 -1
- package/dist/action-bar/ActionBar.svelte +7 -1
- package/dist/attachment-files/FileRender.svelte +1 -1
- package/dist/attachment-files/FileUploadBar.svelte +7 -6
- package/dist/attachment-files/FileUploadPanel.svelte +2 -2
- package/dist/base-calendar/DateContext.js +5 -4
- package/dist/base-calendar/YearPickupPanel.svelte +4 -4
- package/dist/card/Card.svelte +1 -1
- package/dist/card/Card.svelte.d.ts +1 -1
- package/dist/cascade-options-select/CascadeOptionSelect.svelte +2 -3
- package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +46 -1
- package/dist/cascade-options-select/CascadePanel.svelte +1 -1
- package/dist/checkbox/CheckBox.svelte +1 -1
- package/dist/color-picker/ColorPicker.svelte +9 -9
- package/dist/color-picker/ColorPicker.svelte.d.ts +0 -2
- package/dist/color-picker/ColorPickerPanel.svelte +11 -15
- package/dist/color-picker/ColorPickerPanel.svelte.d.ts +1 -1
- package/dist/common/CommonPicker.svelte +2 -2
- package/dist/common/CommonPicker.svelte.d.ts +1 -1
- package/dist/common/MouseClickHandler.d.ts +1 -1
- package/dist/common/Popover.svelte +28 -6
- package/dist/common/Popover.svelte.d.ts +9 -3
- package/dist/common/uniface-utils.js +6 -4
- package/dist/common-editor/CommonEditor.svelte +1 -1
- package/dist/common-editor/CommonEditor.svelte.d.ts +1 -1
- package/dist/common-editor/NumberInput.svelte +1 -1
- package/dist/common-editor/NumberInput.svelte.d.ts +1 -1
- package/dist/concise-data-table/ConciseListTable.svelte +7 -2
- package/dist/concise-data-table/ConciseListTable.svelte.d.ts +1 -0
- package/dist/concise-data-table/DataRow.svelte +1 -1
- package/dist/concise-data-table/TableOptions.d.ts +1 -1
- package/dist/data-table/DataTable.svelte +1 -1
- package/dist/data-table/parts/ActionsPanel.svelte +4 -3
- package/dist/data-table/parts/ActionsRow.svelte +3 -3
- package/dist/data-table/parts/ContentPanel.svelte +3 -2
- package/dist/data-table/parts/FixedColumnsPanel.svelte +0 -1
- package/dist/data-table/parts/FixedColumnsPanel.svelte.d.ts +1 -2
- package/dist/data-table/parts/FixedHeaderPanel.svelte +2 -2
- package/dist/data-table/parts/FixedRow.svelte +2 -1
- package/dist/data-table/parts/FixedRow.svelte.d.ts +1 -1
- package/dist/data-table/parts/HrefCell.svelte +23 -2
- package/dist/data-table/parts/PopupMenu.svelte +25 -2
- package/dist/data-table/parts/PopupMenu.svelte.d.ts +8 -1
- package/dist/date-picker/DatePicker.svelte +0 -1
- package/dist/date-picker/DateTimePicker.svelte +3 -3
- package/dist/date-picker/ScrollBar.svelte +4 -7
- package/dist/date-range/DateRangeEditor.svelte +1 -1
- package/dist/dialog/CommonDialog.svelte +8 -5
- package/dist/dialog/CommonDialog.svelte.d.ts +2 -1
- package/dist/dialog/Dialog.svelte +37 -12
- package/dist/dialog/Dialog.svelte.d.ts +4 -3
- package/dist/dialog/DialogBoard.svelte +11 -8
- package/dist/dialog/DialogWrapper.svelte +10 -0
- package/dist/{common-editor/DateInput.svelte.d.ts → dialog/DialogWrapper.svelte.d.ts} +6 -13
- package/dist/dialog/Dialogs.js +1 -1
- package/dist/dialog/ModalResult.d.ts +5 -0
- package/dist/dialog/ModalResult.js +5 -0
- package/dist/drawer/Drawer.svelte +1 -1
- package/dist/form-field/FormField.svelte +2 -1
- package/dist/form-field/FormField.svelte.d.ts +1 -0
- package/dist/form-panel/flex-row-form/FormContainer.svelte +1 -1
- package/dist/form-panel/grid-form/EmptyCell.svelte +8 -7
- package/dist/form-panel/grid-form/EmptyCell.svelte.d.ts +2 -2
- package/dist/form-panel/grid-form/GridField.svelte +1 -1
- package/dist/i18nRes/i18nRes.d.ts +2 -0
- package/dist/i18nRes/i18nRes.js +44 -0
- package/dist/i18nRes/index.d.ts +2 -0
- package/dist/i18nRes/index.js +2 -0
- package/dist/image-files/ImageFilesField.svelte +1 -1
- package/dist/indicator/IndicatorBoard.svelte +1 -1
- package/dist/inline-cell-editor/InvalidEditor.svelte +1 -0
- package/dist/input-options-select/InputOptionsSelect.svelte +6 -6
- package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +1 -1
- package/dist/layout/flex/FlexBlock.svelte +1 -1
- package/dist/lookup-editor/LookupEditor.svelte +1 -1
- package/dist/memo-editor/MemoEditor.svelte +2 -2
- package/dist/message-box/IMessageBox.d.ts +2 -4
- package/dist/message-box/IMessageBox.js +4 -6
- package/dist/message-box/MessageBoxBoard.svelte +1 -3
- package/dist/options-multi-select/OptionsMultiSelect.svelte +1 -1
- package/dist/prompts-text-editor/PromptsTextEditor.svelte +2 -2
- package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +1 -1
- package/dist/property-editor/PropertyEditor.svelte +3 -3
- package/dist/text-editor/PasswordEditor.svelte +1 -1
- package/dist/transfer/Transfer.svelte +17 -12
- package/dist/transfer/Transfer.svelte.d.ts +0 -1
- package/dist/unit-number-editor/UnitNumberEditor.svelte +2 -2
- package/docs/buttons/cn/ActionBar.md +459 -0
- package/docs/buttons/cn/Button.md +228 -0
- package/docs/buttons/cn/IconButton.md +294 -0
- package/docs/buttons/cn/README.md +600 -0
- package/docs/buttons/cn/TextButton.md +163 -0
- package/docs/buttons/en/ActionBar.md +459 -0
- package/docs/buttons/en/Button.md +228 -0
- package/docs/buttons/en/IconButton.md +294 -0
- package/docs/buttons/en/README.md +600 -0
- package/docs/buttons/en/TextButton.md +163 -0
- package/docs/containers/cn/accordion.md +622 -0
- package/docs/containers/cn/box.md +445 -0
- package/docs/containers/cn/card.md +404 -0
- package/docs/containers/cn/page.md +576 -0
- package/docs/containers/cn/tabs.md +686 -0
- package/docs/containers/en/accordion.md +622 -0
- package/docs/containers/en/box.md +445 -0
- package/docs/containers/en/card.md +404 -0
- package/docs/containers/en/page.md +576 -0
- package/docs/containers/en/tabs.md +686 -0
- package/docs/data-display/cn/concise-data-table.md +731 -0
- package/docs/data-display/cn/listbox.md +786 -0
- package/docs/data-display/cn/treeview.md +863 -0
- package/docs/data-display/en/concise-data-table.md +732 -0
- package/docs/data-display/en/listbox.md +786 -0
- package/docs/data-display/en/treeview.md +863 -0
- package/docs/data-table/cn/README.md +596 -0
- package/docs/data-table/en/README.md +596 -0
- package/docs/dialog/cn/README.md +767 -0
- package/docs/dialog/en/README.md +767 -0
- package/docs/form/cn/README.md +847 -0
- package/docs/form/en/README.md +847 -0
- package/docs/form-components/cn/README.md +495 -0
- package/docs/form-components/cn/attachmentfilesfield.md +757 -0
- package/docs/form-components/cn/cascade-options-select.md +374 -0
- package/docs/form-components/cn/checkbox.md +58 -0
- package/docs/form-components/cn/date-picker.md +138 -0
- package/docs/form-components/cn/datetime-picker.md +228 -0
- package/docs/form-components/cn/group-checkbox.md +405 -0
- package/docs/form-components/cn/group-radiobox.md +525 -0
- package/docs/form-components/cn/imagefilesfield.md +651 -0
- package/docs/form-components/cn/input-options-select.md +250 -0
- package/docs/form-components/cn/lookup-editor.md +406 -0
- package/docs/form-components/cn/memoeditor.md +409 -0
- package/docs/form-components/cn/number-editor.md +261 -0
- package/docs/form-components/cn/options-multi-select.md +177 -0
- package/docs/form-components/cn/options-select.md +83 -0
- package/docs/form-components/cn/passwordeditor.md +538 -0
- package/docs/form-components/cn/prompts-text-editor.md +241 -0
- package/docs/form-components/cn/radiobutton.md +84 -0
- package/docs/form-components/cn/switch.md +178 -0
- package/docs/form-components/cn/text-editor.md +142 -0
- package/docs/form-components/cn/time-editor.md +159 -0
- package/docs/form-components/cn/unit-number-editor.md +164 -0
- package/docs/form-components/en/README.md +463 -0
- package/docs/form-components/en/attachmentfilesfield.md +757 -0
- package/docs/form-components/en/cascade-options-select.md +358 -0
- package/docs/form-components/en/checkbox.md +59 -0
- package/docs/form-components/en/date-picker.md +138 -0
- package/docs/form-components/en/datetime-picker.md +228 -0
- package/docs/form-components/en/group-checkbox.md +395 -0
- package/docs/form-components/en/group-radiobox.md +498 -0
- package/docs/form-components/en/imagefilesfield.md +651 -0
- package/docs/form-components/en/input-options-select.md +239 -0
- package/docs/form-components/en/lookup-editor.md +389 -0
- package/docs/form-components/en/memoeditor.md +409 -0
- package/docs/form-components/en/number-editor.md +249 -0
- package/docs/form-components/en/options-multi-select.md +177 -0
- package/docs/form-components/en/options-select.md +83 -0
- package/docs/form-components/en/passwordeditor.md +538 -0
- package/docs/form-components/en/prompts-text-editor.md +241 -0
- package/docs/form-components/en/radiobutton.md +84 -0
- package/docs/form-components/en/switch.md +180 -0
- package/docs/form-components/en/text-editor.md +142 -0
- package/docs/form-components/en/time-editor.md +159 -0
- package/docs/form-components/en/unit-number-editor.md +164 -0
- package/docs/form-layout/cn/criteria-field.md +652 -0
- package/docs/form-layout/cn/flex-form.md +454 -0
- package/docs/form-layout/cn/flex-row-form.md +542 -0
- package/docs/form-layout/cn/form-field.md +923 -0
- package/docs/form-layout/cn/grid-form.md +676 -0
- package/docs/form-layout/en/criteria-field.md +652 -0
- package/docs/form-layout/en/flex-form.md +454 -0
- package/docs/form-layout/en/flex-row-form.md +542 -0
- package/docs/form-layout/en/form-field.md +923 -0
- package/docs/form-layout/en/grid-form.md +676 -0
- package/docs/global/cn/README.md +534 -0
- package/docs/global/en/README.md +534 -0
- package/docs/layout/cn/classiclayout.md +460 -0
- package/docs/layout/cn/headerlayout.md +524 -0
- package/docs/layout/cn/sidebarlayout.md +263 -0
- package/docs/layout/en/classiclayout.md +951 -0
- package/docs/layout/en/headerlayout.md +524 -0
- package/docs/layout/en/sidebarlayout.md +262 -0
- package/docs/misc/cn/README.md +1217 -0
- package/docs/misc/en/README.md +1217 -0
- package/docs/navigation/cn/breadcrumb.md +291 -0
- package/docs/navigation/cn/navigator.md +322 -0
- package/docs/navigation/cn/navigatormenu.md +512 -0
- package/docs/navigation/cn/progressbar.md +199 -0
- package/docs/navigation/cn/progressstepbar.md +299 -0
- package/docs/navigation/en/breadcrumb.md +291 -0
- package/docs/navigation/en/navigator.md +322 -0
- package/docs/navigation/en/navigatormenu.md +512 -0
- package/docs/navigation/en/progressbar.md +199 -0
- package/docs/navigation/en/progressstepbar.md +299 -0
- package/docs/search-filters/cn/daterange.md +1156 -0
- package/docs/search-filters/cn/numberrange.md +688 -0
- package/docs/search-filters/cn/searchbox.md +1582 -0
- package/docs/search-filters/en/daterange.md +1156 -0
- package/docs/search-filters/en/numberrange.md +688 -0
- package/docs/search-filters/en/searchbox.md +1582 -0
- package/package.json +53 -13
- package/dist/common-editor/DateInput.svelte +0 -27
- package/dist/i18n_resources/index.d.ts +0 -3
- package/dist/i18n_resources/index.js +0 -3
- /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.d.ts +0 -0
- /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.js +0 -0
- /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.d.ts +0 -0
- /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.js +0 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# TimeEditor 组件
|
|
2
|
+
|
|
3
|
+
时间输入组件,支持小时和分钟的选择。
|
|
4
|
+
|
|
5
|
+
## 属性
|
|
6
|
+
|
|
7
|
+
| 属性 | 类型 | 默认值 | 描述 |
|
|
8
|
+
|------|------|--------|------|
|
|
9
|
+
| `variant` | `'' \| 'plain' \| 'outlined' \| 'filled'` | `''` | 外观变体 |
|
|
10
|
+
| `disabled` | `boolean` | `false` | 是否禁用 |
|
|
11
|
+
| `readonly` | `boolean` | `false` | 是否只读 |
|
|
12
|
+
| `compact` | `boolean` | `false` | 是否紧凑模式 |
|
|
13
|
+
| `value` | `string` | `''` | 时间值(格式:HH:MM) |
|
|
14
|
+
| `placeholder` | `string` | `''` | 占位符文本 |
|
|
15
|
+
| `displayMode` | `DisplayMode` | `DisplayMode.Edit` | 显示模式 |
|
|
16
|
+
| `format24h` | `boolean` | `true` | 是否使用24小时格式 |
|
|
17
|
+
| `minuteStep` | `number` | `1` | 分钟步长 |
|
|
18
|
+
| `style` | `string` | `''` | 自定义样式 |
|
|
19
|
+
| `onChange` | `OnChangeHandler<string>` | - | 值变化回调 |
|
|
20
|
+
|
|
21
|
+
## 使用示例
|
|
22
|
+
|
|
23
|
+
```svelte
|
|
24
|
+
<script lang="ts">
|
|
25
|
+
import TimeEditor from '@ticatec/uniface-element/TimeEditor';
|
|
26
|
+
|
|
27
|
+
let startTime: string = '09:00';
|
|
28
|
+
let endTime: string = '17:30';
|
|
29
|
+
|
|
30
|
+
const handleStartTimeChange = (value: string) => {
|
|
31
|
+
startTime = value;
|
|
32
|
+
console.log('开始时间:', value);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const handleEndTimeChange = (value: string) => {
|
|
36
|
+
endTime = value;
|
|
37
|
+
console.log('结束时间:', value);
|
|
38
|
+
};
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<!-- 开始时间 -->
|
|
42
|
+
<TimeEditor
|
|
43
|
+
placeholder="请选择开始时间"
|
|
44
|
+
bind:value={startTime}
|
|
45
|
+
onChange={handleStartTimeChange}
|
|
46
|
+
/>
|
|
47
|
+
|
|
48
|
+
<!-- 结束时间(15分钟间隔) -->
|
|
49
|
+
<TimeEditor
|
|
50
|
+
placeholder="请选择结束时间"
|
|
51
|
+
minuteStep={15}
|
|
52
|
+
bind:value={endTime}
|
|
53
|
+
onChange={handleEndTimeChange}
|
|
54
|
+
/>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 高级用法
|
|
58
|
+
|
|
59
|
+
### 工作时间设置
|
|
60
|
+
```svelte
|
|
61
|
+
<script lang="ts">
|
|
62
|
+
interface WorkingHours {
|
|
63
|
+
start: string;
|
|
64
|
+
end: string;
|
|
65
|
+
break_start: string;
|
|
66
|
+
break_end: string;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let workingHours: WorkingHours = {
|
|
70
|
+
start: '09:00',
|
|
71
|
+
end: '18:00',
|
|
72
|
+
break_start: '12:00',
|
|
73
|
+
break_end: '13:00'
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const updateWorkingHours = (field: keyof WorkingHours) => (value: string) => {
|
|
77
|
+
workingHours = { ...workingHours, [field]: value };
|
|
78
|
+
};
|
|
79
|
+
</script>
|
|
80
|
+
|
|
81
|
+
<div class="working-hours">
|
|
82
|
+
<div class="time-range">
|
|
83
|
+
<label>工作时间:</label>
|
|
84
|
+
<TimeEditor
|
|
85
|
+
placeholder="开始时间"
|
|
86
|
+
minuteStep={30}
|
|
87
|
+
bind:value={workingHours.start}
|
|
88
|
+
onChange={updateWorkingHours('start')}
|
|
89
|
+
/>
|
|
90
|
+
<span>至</span>
|
|
91
|
+
<TimeEditor
|
|
92
|
+
placeholder="结束时间"
|
|
93
|
+
minuteStep={30}
|
|
94
|
+
bind:value={workingHours.end}
|
|
95
|
+
onChange={updateWorkingHours('end')}
|
|
96
|
+
/>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div class="time-range">
|
|
100
|
+
<label>休息时间:</label>
|
|
101
|
+
<TimeEditor
|
|
102
|
+
placeholder="开始时间"
|
|
103
|
+
minuteStep={15}
|
|
104
|
+
bind:value={workingHours.break_start}
|
|
105
|
+
onChange={updateWorkingHours('break_start')}
|
|
106
|
+
/>
|
|
107
|
+
<span>至</span>
|
|
108
|
+
<TimeEditor
|
|
109
|
+
placeholder="结束时间"
|
|
110
|
+
minuteStep={15}
|
|
111
|
+
bind:value={workingHours.break_end}
|
|
112
|
+
onChange={updateWorkingHours('break_end')}
|
|
113
|
+
/>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## 最佳实践
|
|
119
|
+
|
|
120
|
+
### 1. 设置合适的步长
|
|
121
|
+
```svelte
|
|
122
|
+
<!-- 会议时间:15分钟间隔 -->
|
|
123
|
+
<TimeEditor minuteStep={15} />
|
|
124
|
+
|
|
125
|
+
<!-- 工作班次:30分钟间隔 -->
|
|
126
|
+
<TimeEditor minuteStep={30} />
|
|
127
|
+
|
|
128
|
+
<!-- 精确时间:1分钟间隔 -->
|
|
129
|
+
<TimeEditor minuteStep={1} />
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 2. 时间范围验证
|
|
133
|
+
```svelte
|
|
134
|
+
<script lang="ts">
|
|
135
|
+
let startTime: string = '';
|
|
136
|
+
let endTime: string = '';
|
|
137
|
+
let timeError: string = '';
|
|
138
|
+
|
|
139
|
+
const validateTimeRange = (start: string, end: string): void => {
|
|
140
|
+
if (start && end) {
|
|
141
|
+
const startMinutes = timeToMinutes(start);
|
|
142
|
+
const endMinutes = timeToMinutes(end);
|
|
143
|
+
|
|
144
|
+
if (startMinutes >= endMinutes) {
|
|
145
|
+
timeError = '结束时间必须晚于开始时间';
|
|
146
|
+
} else {
|
|
147
|
+
timeError = '';
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const timeToMinutes = (time: string): number => {
|
|
153
|
+
const [hours, minutes] = time.split(':').map(Number);
|
|
154
|
+
return hours * 60 + minutes;
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
$: validateTimeRange(startTime, endTime);
|
|
158
|
+
</script>
|
|
159
|
+
```
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# UnitNumberEditor 组件
|
|
2
|
+
|
|
3
|
+
带单位的数字输入组件,允许用户选择不同的计量单位。
|
|
4
|
+
|
|
5
|
+
## 类型定义
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
interface UnitOption {
|
|
9
|
+
code: string;
|
|
10
|
+
text: string;
|
|
11
|
+
ratio: number; // 与基础单位的换算比例
|
|
12
|
+
}
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 属性
|
|
16
|
+
|
|
17
|
+
| 属性 | 类型 | 默认值 | 描述 |
|
|
18
|
+
|------|------|--------|------|
|
|
19
|
+
| `variant` | `'' \| 'plain' \| 'outlined' \| 'filled'` | `''` | 外观变体 |
|
|
20
|
+
| `disabled` | `boolean` | `false` | 是否禁用 |
|
|
21
|
+
| `readonly` | `boolean` | `false` | 是否只读 |
|
|
22
|
+
| `compact` | `boolean` | `false` | 是否紧凑模式 |
|
|
23
|
+
| `value` | `number \| null` | `null` | 数值 |
|
|
24
|
+
| `unit` | `string` | `''` | 当前选择的单位代码 |
|
|
25
|
+
| `units` | `UnitOption[]` | `[]` | 可用单位选项 |
|
|
26
|
+
| `placeholder` | `string` | `''` | 占位符文本 |
|
|
27
|
+
| `displayMode` | `DisplayMode` | `DisplayMode.Edit` | 显示模式 |
|
|
28
|
+
| `precision` | `number \| null` | `null` | 小数位数 |
|
|
29
|
+
| `style` | `string` | `''` | 自定义样式 |
|
|
30
|
+
| `onChange` | `OnChangeHandler<{value: number, unit: string}>` | - | 值变化回调 |
|
|
31
|
+
|
|
32
|
+
## 使用示例
|
|
33
|
+
|
|
34
|
+
```svelte
|
|
35
|
+
<script lang="ts">
|
|
36
|
+
import UnitNumberEditor, { type UnitOption } from '@ticatec/uniface-element/UnitNumberEditor';
|
|
37
|
+
|
|
38
|
+
// 重量单位选项
|
|
39
|
+
const weightUnits: UnitOption[] = [
|
|
40
|
+
{ code: 'kg', text: '千克', ratio: 1 },
|
|
41
|
+
{ code: 'g', text: '克', ratio: 0.001 },
|
|
42
|
+
{ code: 'lb', text: '磅', ratio: 0.453592 }
|
|
43
|
+
];
|
|
44
|
+
|
|
45
|
+
// 距离单位选项
|
|
46
|
+
const distanceUnits: UnitOption[] = [
|
|
47
|
+
{ code: 'm', text: '米', ratio: 1 },
|
|
48
|
+
{ code: 'cm', text: '厘米', ratio: 0.01 },
|
|
49
|
+
{ code: 'km', text: '公里', ratio: 1000 },
|
|
50
|
+
{ code: 'in', text: '英寸', ratio: 0.0254 }
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
let weight: number | null = null;
|
|
54
|
+
let weightUnit: string = 'kg';
|
|
55
|
+
let distance: number | null = null;
|
|
56
|
+
let distanceUnit: string = 'm';
|
|
57
|
+
|
|
58
|
+
interface UnitValue {
|
|
59
|
+
value: number;
|
|
60
|
+
unit: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const handleWeightChange = ({value, unit}: UnitValue): void => {
|
|
64
|
+
weight = value;
|
|
65
|
+
weightUnit = unit;
|
|
66
|
+
console.log(`重量: ${value} ${unit}`);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const handleDistanceChange = ({value, unit}: UnitValue): void => {
|
|
70
|
+
distance = value;
|
|
71
|
+
distanceUnit = unit;
|
|
72
|
+
console.log(`距离: ${value} ${unit}`);
|
|
73
|
+
};
|
|
74
|
+
</script>
|
|
75
|
+
|
|
76
|
+
<!-- 重量输入 -->
|
|
77
|
+
<UnitNumberEditor
|
|
78
|
+
placeholder="请输入重量"
|
|
79
|
+
units={weightUnits}
|
|
80
|
+
precision={2}
|
|
81
|
+
bind:value={weight}
|
|
82
|
+
bind:unit={weightUnit}
|
|
83
|
+
onChange={handleWeightChange}
|
|
84
|
+
/>
|
|
85
|
+
|
|
86
|
+
<!-- 距离输入 -->
|
|
87
|
+
<UnitNumberEditor
|
|
88
|
+
placeholder="请输入距离"
|
|
89
|
+
units={distanceUnits}
|
|
90
|
+
precision={2}
|
|
91
|
+
bind:value={distance}
|
|
92
|
+
bind:unit={distanceUnit}
|
|
93
|
+
onChange={handleDistanceChange}
|
|
94
|
+
/>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 高级用法
|
|
98
|
+
|
|
99
|
+
### 单位换算
|
|
100
|
+
```svelte
|
|
101
|
+
<script lang="ts">
|
|
102
|
+
let inputValue: number | null = null;
|
|
103
|
+
let inputUnit: string = 'kg';
|
|
104
|
+
let baseValue: number | null = null; // 基础单位值
|
|
105
|
+
|
|
106
|
+
const convertToBase = (value: number, unit: string, units: UnitOption[]): number => {
|
|
107
|
+
const unitOption = units.find(u => u.code === unit);
|
|
108
|
+
return value * (unitOption?.ratio || 1);
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const handleValueChange = ({value, unit}: UnitValue): void => {
|
|
112
|
+
inputValue = value;
|
|
113
|
+
inputUnit = unit;
|
|
114
|
+
|
|
115
|
+
if (value !== null) {
|
|
116
|
+
baseValue = convertToBase(value, unit, weightUnits);
|
|
117
|
+
console.log(`基础值: ${baseValue} kg`);
|
|
118
|
+
} else {
|
|
119
|
+
baseValue = null;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
</script>
|
|
123
|
+
|
|
124
|
+
<UnitNumberEditor
|
|
125
|
+
placeholder="请输入重量"
|
|
126
|
+
units={weightUnits}
|
|
127
|
+
precision={3}
|
|
128
|
+
bind:value={inputValue}
|
|
129
|
+
bind:unit={inputUnit}
|
|
130
|
+
onChange={handleValueChange}
|
|
131
|
+
/>
|
|
132
|
+
|
|
133
|
+
{#if baseValue !== null}
|
|
134
|
+
<p>等于: {baseValue.toFixed(3)} kg</p>
|
|
135
|
+
{/if}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## 最佳实践
|
|
139
|
+
|
|
140
|
+
### 1. 合理设置精度
|
|
141
|
+
```svelte
|
|
142
|
+
<!-- 重量:3位小数 -->
|
|
143
|
+
<UnitNumberEditor units={weightUnits} precision={3} />
|
|
144
|
+
|
|
145
|
+
<!-- 距离:2位小数 -->
|
|
146
|
+
<UnitNumberEditor units={distanceUnits} precision={2} />
|
|
147
|
+
|
|
148
|
+
<!-- 温度:1位小数 -->
|
|
149
|
+
<UnitNumberEditor units={temperatureUnits} precision={1} />
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 2. 提供常用单位
|
|
153
|
+
```svelte
|
|
154
|
+
<script lang="ts">
|
|
155
|
+
// 按使用频率排序
|
|
156
|
+
const lengthUnits: UnitOption[] = [
|
|
157
|
+
{ code: 'm', text: '米', ratio: 1 }, // 最常用
|
|
158
|
+
{ code: 'cm', text: '厘米', ratio: 0.01 }, // 常用
|
|
159
|
+
{ code: 'mm', text: '毫米', ratio: 0.001 }, // 常用
|
|
160
|
+
{ code: 'km', text: '公里', ratio: 1000 }, // 较少用
|
|
161
|
+
{ code: 'in', text: '英寸', ratio: 0.0254 } // 特殊需求
|
|
162
|
+
];
|
|
163
|
+
</script>
|
|
164
|
+
```
|