@tendaui/components 1.2.4 → 1.3.1
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/_util/scroll.ts +9 -0
- package/alert/_example/base.tsx +13 -0
- package/alert/_example/collapse.tsx +15 -0
- package/badge/_example/base.tsx +10 -0
- package/badge/_example/count.tsx +29 -0
- package/badge/_example/custom-color.tsx +32 -0
- package/badge/_example/dot.tsx +26 -0
- package/badge/_example/max-count.tsx +26 -0
- package/badge/_example/offset.tsx +29 -0
- package/badge/_example/shape.tsx +32 -0
- package/badge/_example/show-zero.tsx +23 -0
- package/badge/_example/size.tsx +35 -0
- package/badge/_example/standalone.tsx +14 -0
- package/badge/_example/text-count.tsx +26 -0
- package/badge/_example/with-button.tsx +23 -0
- package/button/_example/block.tsx +18 -0
- package/button/_example/disabled.tsx +22 -0
- package/button/_example/ghost.tsx +21 -0
- package/button/_example/link.tsx +15 -0
- package/button/_example/loading.tsx +19 -0
- package/button/_example/shape.tsx +18 -0
- package/button/_example/size.tsx +18 -0
- package/button/_example/suffix.tsx +16 -0
- package/button/_example/theme.tsx +14 -0
- package/button/_example/variant-base.tsx +24 -0
- package/button/_example/variant-dashed.tsx +24 -0
- package/button/_example/variant-outline.tsx +24 -0
- package/button/_example/variant-text.tsx +24 -0
- package/checkbox/_example/base.tsx +8 -0
- package/checkbox/_example/controlled.tsx +11 -0
- package/checkbox/_example/group-disabled.tsx +13 -0
- package/checkbox/_example/group-with-check-all.tsx +22 -0
- package/checkbox/_example/group-with-max.tsx +17 -0
- package/checkbox/_example/group-with-options.tsx +18 -0
- package/checkbox/_example/group.tsx +17 -0
- package/checkbox/_example/states.tsx +19 -0
- package/color-picker/ColorPicker.tsx +16 -2
- package/color-picker/_example/base.tsx +12 -0
- package/color-picker/_example/borderless.tsx +17 -0
- package/color-picker/_example/clearable.tsx +12 -0
- package/color-picker/_example/disabled.tsx +17 -0
- package/color-picker/_example/formats.tsx +30 -0
- package/color-picker/_example/manual-input.tsx +39 -0
- package/color-picker/_example/recent-colors.tsx +19 -0
- package/color-picker/_example/swatch-colors.tsx +28 -0
- package/color-picker/_example/with-alpha.tsx +21 -0
- package/color-picker/components/panel/format/inputs.tsx +1 -1
- package/color-picker/components/panel/index.tsx +13 -0
- package/color-picker/components/trigger.tsx +64 -13
- package/color-picker/defaultProps.ts +4 -1
- package/color-picker/utils/color-picker/cmyk.ts +5 -5
- package/color-picker/utils/color-picker/draggable.ts +14 -15
- package/color-picker/utils/color-picker/format.ts +21 -26
- package/color-picker/utils/color-picker/gradient.ts +35 -41
- package/color-picker/utils/color-picker/types.ts +4 -4
- package/config-provider/ConfigContext.tsx +1 -0
- package/config-provider/ConfigProvider.tsx +18 -1
- package/config-provider/type.ts +5 -0
- package/dialog/_example/base.tsx +27 -0
- package/dialog/_example/confirm-loading.tsx +32 -0
- package/dialog/_example/custom-buttons.tsx +24 -0
- package/dialog/_example/full-screen.tsx +26 -0
- package/dialog/_example/hide-buttons.tsx +39 -0
- package/dialog/_example/modeless.tsx +25 -0
- package/dialog/_example/placement.tsx +40 -0
- package/dialog/_example/plugin-example.tsx +69 -0
- package/dialog/_example/themes.tsx +41 -0
- package/drawer/Drawer.tsx +17 -9
- package/drawer/_example/custom-header-footer.tsx +29 -0
- package/drawer/_example/default.tsx +20 -0
- package/drawer/_example/events.tsx +53 -0
- package/drawer/_example/no-footer.tsx +20 -0
- package/drawer/_example/no-overlay.tsx +20 -0
- package/drawer/_example/placement.tsx +43 -0
- package/drawer/_example/size-draggable.tsx +26 -0
- package/drawer/_example/size.tsx +40 -0
- package/drawer/defaultProps.ts +1 -1
- package/fireworks/Fireworks.tsx +1 -10
- package/fireworks/index.ts +0 -1
- package/fireworks/type.ts +0 -1
- package/form/_example/complex.tsx +76 -0
- package/form/_example/default.tsx +58 -0
- package/form/_example/disabled.tsx +26 -0
- package/form/_example/form-list.tsx +74 -0
- package/form/_example/inline-layout.tsx +20 -0
- package/form/_example/label-align.tsx +46 -0
- package/form/_example/methods.tsx +66 -0
- package/form/_example/validation.tsx +71 -0
- package/form/hooks/useFormItemStyle.tsx +19 -7
- package/form/index.ts +20 -2
- package/global-config/default-config.ts +28 -28
- package/global-config/locale/ar_KW.ts +176 -187
- package/global-config/locale/en_US.ts +180 -195
- package/global-config/locale/it_IT.ts +174 -197
- package/global-config/locale/ja_JP.ts +178 -193
- package/global-config/locale/ko_KR.ts +178 -193
- package/global-config/locale/ru_RU.ts +189 -200
- package/global-config/locale/zh_CN.ts +179 -193
- package/global-config/locale/zh_TW.ts +178 -192
- package/global-config/mobile/default-config.ts +3 -3
- package/global-config/mobile/locale/ar_KW.ts +76 -77
- package/global-config/mobile/locale/en_US.ts +76 -77
- package/global-config/mobile/locale/it_IT.ts +76 -77
- package/global-config/mobile/locale/ja_JP.ts +64 -65
- package/global-config/mobile/locale/ko_KR.ts +64 -65
- package/global-config/mobile/locale/ru_RU.ts +76 -77
- package/global-config/mobile/locale/zh_CN.ts +64 -65
- package/global-config/mobile/locale/zh_TW.ts +64 -65
- package/global-config/t.ts +12 -12
- package/hooks/useDebounce.ts +27 -0
- package/hooks/useLastest.ts +6 -2
- package/hooks/useResizeObserve.ts +0 -1
- package/index.ts +1 -1
- package/input/Input.tsx +53 -10
- package/input/_example/auto-width.tsx +14 -0
- package/input/_example/borderless.tsx +17 -0
- package/input/_example/clearable.tsx +14 -0
- package/input/_example/default.tsx +10 -0
- package/input/_example/disabled-readonly.tsx +12 -0
- package/input/_example/events.tsx +42 -0
- package/input/_example/group.tsx +14 -0
- package/input/_example/label-suffix.tsx +12 -0
- package/input/_example/max-length.tsx +11 -0
- package/input/_example/password.tsx +14 -0
- package/input/_example/sizes.tsx +12 -0
- package/input/_example/status.tsx +13 -0
- package/input/_example/text-align.tsx +12 -0
- package/input/_example/with-icon.tsx +13 -0
- package/input/type.ts +3 -0
- package/input/useLengthLimit.ts +122 -0
- package/input-number/_example/align.tsx +23 -0
- package/input-number/_example/auto-width.tsx +8 -0
- package/input-number/_example/default.tsx +8 -0
- package/input-number/_example/events.tsx +45 -0
- package/input-number/_example/format.tsx +27 -0
- package/input-number/_example/large-number.tsx +17 -0
- package/input-number/_example/min-max.tsx +14 -0
- package/input-number/_example/sizes.tsx +35 -0
- package/input-number/_example/status.tsx +65 -0
- package/input-number/_example/step-and-decimal.tsx +14 -0
- package/input-number/_example/themes.tsx +21 -0
- package/input-number/_example/with-suffix.tsx +12 -0
- package/ip-input/_example/controlled.tsx +26 -0
- package/ip-input/_example/default.tsx +12 -0
- package/ip-input/_example/full-featured.tsx +32 -0
- package/ip-input/_example/ipv6.tsx +23 -0
- package/ip-input/_example/keyboard-navigation.tsx +19 -0
- package/ip-input/_example/paste-demo.tsx +23 -0
- package/ip-input/_example/states.tsx +21 -0
- package/ip-input/_example/with-cidr.tsx +23 -0
- package/layout/_example/combine-left.tsx +54 -0
- package/layout/_example/combine-right.tsx +54 -0
- package/layout/_example/custom-aside-width.tsx +56 -0
- package/layout/_example/custom-height.tsx +45 -0
- package/layout/_example/double-sidebar.tsx +57 -0
- package/layout/_example/side-navigation-right.tsx +51 -0
- package/layout/_example/side-navigation.tsx +51 -0
- package/layout/_example/top-navigation.tsx +41 -0
- package/list/_example/async-loading.tsx +46 -0
- package/list/_example/default.tsx +23 -0
- package/list/_example/header-footer.tsx +40 -0
- package/list/_example/multiline.tsx +24 -0
- package/list/_example/scroll-loading.tsx +69 -0
- package/list/_example/sizes.tsx +45 -0
- package/list/_example/split.tsx +36 -0
- package/list/_example/stripe.tsx +24 -0
- package/list/_example/virtual-scroll.tsx +51 -0
- package/list/_example/with-image.tsx +26 -0
- package/loading/_example/default.tsx +6 -0
- package/loading/_example/delay.tsx +53 -0
- package/loading/_example/fullscreen.tsx +29 -0
- package/loading/_example/inherit-color.tsx +24 -0
- package/loading/_example/no-overlay.tsx +15 -0
- package/loading/_example/sizes.tsx +25 -0
- package/loading/_example/with-text.tsx +12 -0
- package/loading/_example/wrapper.tsx +30 -0
- package/notification/_example/default.tsx +31 -0
- package/notification/_example/long-content.tsx +37 -0
- package/notification/_example/stacking.tsx +40 -0
- package/notification/_example/types.tsx +78 -0
- package/notification/_example/usage-example.tsx +62 -0
- package/package.json +4 -3
- package/popup/Popup.tsx +17 -5
- package/popup/_example/controlled.tsx +32 -0
- package/popup/_example/custom-content.tsx +64 -0
- package/popup/_example/default.tsx +19 -0
- package/popup/_example/delay.tsx +35 -0
- package/popup/_example/disabled.tsx +17 -0
- package/popup/_example/no-arrow.tsx +17 -0
- package/popup/_example/placements.tsx +61 -0
- package/popup/_example/triggers.tsx +26 -0
- package/radio/_example/allow-uncheck.tsx +19 -0
- package/radio/_example/button-style.tsx +40 -0
- package/radio/_example/controlled.tsx +13 -0
- package/radio/_example/default.tsx +13 -0
- package/radio/_example/group-disabled.tsx +22 -0
- package/radio/_example/group-with-options.tsx +20 -0
- package/radio/_example/group.tsx +19 -0
- package/radio/_example/sizes.tsx +37 -0
- package/radio/_example/states.tsx +20 -0
- package/select/_example/collapsed.tsx +30 -0
- package/select/_example/creatable.tsx +36 -0
- package/select/_example/custom-content.tsx +26 -0
- package/select/_example/default.tsx +29 -0
- package/select/_example/disabled.tsx +20 -0
- package/select/_example/filterable.tsx +27 -0
- package/select/_example/group-options.tsx +44 -0
- package/select/_example/label-suffix.tsx +24 -0
- package/select/_example/loading.tsx +19 -0
- package/select/_example/multiple.tsx +31 -0
- package/select/_example/sizes.tsx +20 -0
- package/select/_example/status.tsx +27 -0
- package/slider/Slider.tsx +13 -5
- package/slider/_example/custom-label.tsx +19 -0
- package/slider/_example/default.tsx +14 -0
- package/slider/_example/disabled.tsx +17 -0
- package/slider/_example/marks.tsx +31 -0
- package/slider/_example/range.tsx +16 -0
- package/slider/_example/step.tsx +14 -0
- package/slider/_example/vertical.tsx +26 -0
- package/slider/_example/with-input-number.tsx +21 -0
- package/slider/type.ts +1 -1
- package/styles/_vars.scss +16 -0
- package/styles/components/button/_index.scss +3 -3
- package/styles/components/dialog/_index.scss +18 -20
- package/styles/components/drawer/_index.scss +4 -3
- package/styles/components/drawer/_var.scss +1 -1
- package/styles/components/form/_index.scss +7 -6
- package/styles/components/input/_mixins.scss +7 -5
- package/styles/components/input-number/_index.scss +13 -12
- package/styles/components/list/_index.scss +5 -5
- package/styles/components/notification/_index.scss +4 -4
- package/styles/components/slider/_index.scss +8 -8
- package/styles/components/switch/_index.scss +98 -15
- package/styles/components/table/_index.scss +37 -29
- package/styles/components/tabs/_index.scss +8 -9
- package/styles/components/tooltip/_index.scss +104 -0
- package/styles/components/tooltip/_vars.scss +23 -0
- package/switch/_example/async-change.tsx +25 -0
- package/switch/_example/before-change.tsx +22 -0
- package/switch/_example/controlled.tsx +14 -0
- package/switch/_example/custom-value.tsx +21 -0
- package/switch/_example/default.tsx +6 -0
- package/switch/_example/disabled.tsx +25 -0
- package/switch/_example/loading.tsx +17 -0
- package/switch/_example/sizes.tsx +21 -0
- package/switch/_example/with-label.tsx +21 -0
- package/tab/TabPanel.tsx +9 -6
- package/tab/_example/addable.tsx +45 -0
- package/tab/_example/card-theme.tsx +22 -0
- package/tab/_example/default.tsx +22 -0
- package/tab/_example/disabled.tsx +38 -0
- package/tab/_example/lazy.tsx +25 -0
- package/tab/_example/placement.tsx +36 -0
- package/tab/_example/removable.tsx +31 -0
- package/tab/_example/sizes.tsx +31 -0
- package/tab/_example/with-action.tsx +26 -0
- package/table/Cell.tsx +3 -6
- package/table/Ellipsis.tsx +73 -0
- package/table/_example/alignment.tsx +46 -0
- package/table/_example/auto-width.tsx +47 -0
- package/table/_example/bordered-stripe-hover.tsx +42 -0
- package/table/_example/bordered.tsx +42 -0
- package/table/_example/cell-click.tsx +52 -0
- package/table/_example/complex.tsx +82 -0
- package/table/_example/custom-cell.tsx +68 -0
- package/table/_example/custom-empty.tsx +37 -0
- package/table/_example/custom-row-class-name.tsx +57 -0
- package/table/_example/default.tsx +42 -0
- package/table/_example/ellipsis.tsx +56 -0
- package/table/_example/empty.tsx +28 -0
- package/table/_example/fixed-width.tsx +48 -0
- package/table/_example/hover.tsx +42 -0
- package/table/_example/row-click.tsx +52 -0
- package/table/_example/sizes.tsx +57 -0
- package/table/_example/stripe.tsx +42 -0
- package/table/_example/vertical-align.tsx +110 -0
- package/table/hooks/useTableClassName.ts +3 -3
- package/table/index.ts +2 -0
- package/table/type.ts +1 -0
- package/tag/Tag.tsx +1 -1
- package/tag/_example/closable.tsx +44 -0
- package/tag/_example/default.tsx +17 -0
- package/tag/_example/disabled.tsx +19 -0
- package/tag/_example/sizes.tsx +18 -0
- package/tag/_example/variants.tsx +37 -0
- package/tag-input/_example/collapsed.tsx +27 -0
- package/tag-input/_example/controlled-uncontrolled.tsx +26 -0
- package/tag-input/_example/default.tsx +15 -0
- package/tag-input/_example/disabled-readonly.tsx +21 -0
- package/tag-input/_example/events.tsx +64 -0
- package/tag-input/_example/excess-display.tsx +27 -0
- package/tag-input/_example/max-tags.tsx +22 -0
- package/tag-input/_example/sizes.tsx +21 -0
- package/tag-input/_example/status.tsx +37 -0
- package/tag-input/_example/with-label.tsx +23 -0
- package/tag-input/hooks/useTagList.tsx +1 -1
- package/tooltip/Tooltip.tsx +76 -0
- package/tooltip/_example/base.tsx +26 -0
- package/tooltip/_example/custom-content.tsx +47 -0
- package/tooltip/_example/placement.tsx +33 -0
- package/tooltip/_example/theme.tsx +34 -0
- package/tooltip/defaultProps.ts +14 -0
- package/tooltip/index.ts +7 -0
- package/tooltip/style/index.js +1 -0
- package/tooltip/type.ts +99 -0
- package/utils/log/index.ts +1 -1
- package/utils/log/log.ts +2 -3
- package/utils/log/types.ts +1 -4
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const DisabledReadonlyInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
6
|
+
<Input placeholder="正常状态" />
|
|
7
|
+
<Input disabled placeholder="禁用状态" defaultValue="禁用内容" />
|
|
8
|
+
<Input readonly placeholder="只读状态" defaultValue="只读内容" />
|
|
9
|
+
</div>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default DisabledReadonlyInput;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const EventsInput = () => {
|
|
5
|
+
const [log, setLog] = useState<string[]>([]);
|
|
6
|
+
|
|
7
|
+
const addLog = (msg: string) => {
|
|
8
|
+
setLog((prev) => [...prev.slice(-4), msg]);
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
return (
|
|
12
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
13
|
+
<Input
|
|
14
|
+
placeholder="触发各种事件(查看下方日志)"
|
|
15
|
+
clearable
|
|
16
|
+
onChange={(val) => addLog(`onChange: ${val}`)}
|
|
17
|
+
onFocus={() => addLog("onFocus")}
|
|
18
|
+
onBlur={() => addLog("onBlur")}
|
|
19
|
+
onEnter={(val) => addLog(`onEnter: ${val}`)}
|
|
20
|
+
onClear={() => addLog("onClear")}
|
|
21
|
+
/>
|
|
22
|
+
<div
|
|
23
|
+
style={{
|
|
24
|
+
padding: "12px",
|
|
25
|
+
background: "var(--tendaui-color-primary-1)",
|
|
26
|
+
borderRadius: "4px",
|
|
27
|
+
fontSize: "12px",
|
|
28
|
+
fontFamily: "monospace"
|
|
29
|
+
}}
|
|
30
|
+
>
|
|
31
|
+
<div style={{ marginBottom: "8px", fontWeight: "bold" }}>事件日志:</div>
|
|
32
|
+
{log.length === 0 ? (
|
|
33
|
+
<div style={{ color: "#999" }}>暂无事件触发</div>
|
|
34
|
+
) : (
|
|
35
|
+
log.map((item, index) => <div key={index}>{item}</div>)
|
|
36
|
+
)}
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export default EventsInput;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input, InputGroup } from "../index";
|
|
3
|
+
import { IconUser, IconLock } from "@tendaui/icons";
|
|
4
|
+
|
|
5
|
+
const InputGroupExample = () => (
|
|
6
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
7
|
+
<InputGroup separate>
|
|
8
|
+
<Input placeholder="用户名" prefixIcon={<IconUser />} />
|
|
9
|
+
<Input type="password" placeholder="密码" prefixIcon={<IconLock />} />
|
|
10
|
+
</InputGroup>
|
|
11
|
+
</div>
|
|
12
|
+
);
|
|
13
|
+
|
|
14
|
+
export default InputGroupExample;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const LabelSuffixInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
6
|
+
<Input label="http://" placeholder="请输入网址" />
|
|
7
|
+
<Input suffix=".com" placeholder="请输入域名" />
|
|
8
|
+
<Input label="http://" suffix=".com" placeholder="请输入域名" />
|
|
9
|
+
</div>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default LabelSuffixInput;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const MaxLengthInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
6
|
+
<Input maxlength={10} placeholder="最多输入10个字符" />
|
|
7
|
+
<Input maxcharacter={20} placeholder="最多输入20个字符(中文算2个)" />
|
|
8
|
+
</div>
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
export default MaxLengthInput;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
import { IconLock, IconEyeOpened, IconEyeClosed } from "@tendaui/icons";
|
|
4
|
+
|
|
5
|
+
const PasswordInput = () => {
|
|
6
|
+
const [visible, setVisible] = useState(false);
|
|
7
|
+
return (
|
|
8
|
+
<div style={{ width: 500 }}>
|
|
9
|
+
<Input type={visible ? "text" : "password"} prefixIcon={<IconLock />} placeholder="请输入密码" />
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default PasswordInput;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const SizesInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
6
|
+
<Input size="small" placeholder="小尺寸" />
|
|
7
|
+
<Input size="medium" placeholder="中尺寸(默认)" />
|
|
8
|
+
<Input size="large" placeholder="大尺寸" />
|
|
9
|
+
</div>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default SizesInput;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const StatusInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "24px", width: "500px", margin: "8px 0" }}>
|
|
6
|
+
<Input status="default" placeholder="默认状态" tips="这是一条提示信息" />
|
|
7
|
+
<Input status="success" placeholder="成功状态" tips="校验通过" />
|
|
8
|
+
<Input status="warning" placeholder="警告状态" tips="请注意输入内容" />
|
|
9
|
+
<Input status="error" placeholder="错误状态" tips="输入内容有误" />
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
export default StatusInput;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
|
|
4
|
+
const TextAlignInput = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: 500 }}>
|
|
6
|
+
<Input align="left" placeholder="左对齐" defaultValue="左对齐内容" />
|
|
7
|
+
<Input align="center" placeholder="居中对齐" defaultValue="居中对齐内容" />
|
|
8
|
+
<Input align="right" placeholder="右对齐" defaultValue="右对齐内容" />
|
|
9
|
+
</div>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default TextAlignInput;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Input } from "../index";
|
|
3
|
+
import { IconSearch, IconUser } from "@tendaui/icons";
|
|
4
|
+
|
|
5
|
+
const WithIconInput = () => (
|
|
6
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px", width: "500px" }}>
|
|
7
|
+
<Input prefixIcon={<IconSearch />} placeholder="前置图标" />
|
|
8
|
+
<Input suffixIcon={<IconSearch />} placeholder="后置图标" />
|
|
9
|
+
<Input prefixIcon={<IconUser />} suffixIcon={<IconSearch />} placeholder="前后图标" />
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
export default WithIconInput;
|
package/input/type.ts
CHANGED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { useEffect, useMemo } from 'react';
|
|
2
|
+
import { isNumber } from 'lodash-es';
|
|
3
|
+
import { TdInputProps } from './type';
|
|
4
|
+
|
|
5
|
+
// 计算字符长度,中文算两个字符
|
|
6
|
+
function getCharacterLength(str: string): number;
|
|
7
|
+
function getCharacterLength(str: string, maxCharacter?: number): { length: number; characters: string }
|
|
8
|
+
function getCharacterLength(str: string, maxCharacter?: number) {
|
|
9
|
+
const hasMaxCharacter = isNumber(maxCharacter);
|
|
10
|
+
if (!str || str.length === 0) {
|
|
11
|
+
if (hasMaxCharacter) {
|
|
12
|
+
return {
|
|
13
|
+
length: 0,
|
|
14
|
+
characters: str,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
let len = 0;
|
|
20
|
+
for (let i = 0; i < str.length; i++) {
|
|
21
|
+
let currentStringLength = 0;
|
|
22
|
+
if (str.charCodeAt(i) > 127) {
|
|
23
|
+
currentStringLength = 2;
|
|
24
|
+
} else {
|
|
25
|
+
currentStringLength = 1;
|
|
26
|
+
}
|
|
27
|
+
if (hasMaxCharacter && len + currentStringLength > maxCharacter) {
|
|
28
|
+
return {
|
|
29
|
+
length: len,
|
|
30
|
+
characters: str.slice(0, i),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
len += currentStringLength;
|
|
34
|
+
}
|
|
35
|
+
if (hasMaxCharacter) {
|
|
36
|
+
return {
|
|
37
|
+
length: len,
|
|
38
|
+
characters: str,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return len;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// 计算 Unicode 长度
|
|
45
|
+
function getUnicodeLength(str: string): number {
|
|
46
|
+
return Array.from(str).length;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// 限制 Unicode 最大长度
|
|
50
|
+
function limitUnicodeMaxLength(str: string, maxLength: number): string {
|
|
51
|
+
return Array.from(str).slice(0, maxLength).join('');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface UseLengthLimitParams {
|
|
55
|
+
value: string | undefined;
|
|
56
|
+
maxlength: number;
|
|
57
|
+
maxcharacter: number;
|
|
58
|
+
allowInputOverMax: boolean;
|
|
59
|
+
status: TdInputProps['status'];
|
|
60
|
+
onValidate: TdInputProps['onValidate'];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export default function useLengthLimit(params: UseLengthLimitParams) {
|
|
64
|
+
// 文本超出数量限制时,是否允许继续输入
|
|
65
|
+
const getValueByLimitNumber = (inputValue: string) => {
|
|
66
|
+
const { allowInputOverMax, maxlength, maxcharacter } = params;
|
|
67
|
+
if (!(maxlength || maxcharacter) || allowInputOverMax || !inputValue) return inputValue;
|
|
68
|
+
if (maxlength) {
|
|
69
|
+
// input value could be unicode 😊
|
|
70
|
+
return limitUnicodeMaxLength(inputValue, maxlength);
|
|
71
|
+
}
|
|
72
|
+
if (maxcharacter) {
|
|
73
|
+
const r = getCharacterLength(inputValue, maxcharacter);
|
|
74
|
+
if (typeof r === 'object') {
|
|
75
|
+
return r.characters;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return inputValue;
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const limitNumber = useMemo(() => {
|
|
82
|
+
const { maxlength, maxcharacter, value } = params;
|
|
83
|
+
if (typeof value === 'number') return String(value);
|
|
84
|
+
if (maxlength && maxcharacter) {
|
|
85
|
+
console.warn('Input', 'Pick one of maxlength and maxcharacter please.');
|
|
86
|
+
}
|
|
87
|
+
if (maxlength) {
|
|
88
|
+
const length = value?.length ? getUnicodeLength(value) : 0;
|
|
89
|
+
return `${length}/${maxlength}`;
|
|
90
|
+
}
|
|
91
|
+
if (maxcharacter) {
|
|
92
|
+
return `${getCharacterLength(value || '')}/${maxcharacter}`;
|
|
93
|
+
}
|
|
94
|
+
return '';
|
|
95
|
+
}, [params.maxcharacter, params.maxlength, params.value]);
|
|
96
|
+
|
|
97
|
+
const innerStatus = useMemo(() => {
|
|
98
|
+
if (limitNumber) {
|
|
99
|
+
const [current, total] = limitNumber.split('/');
|
|
100
|
+
return Number(current) > Number(total) ? 'error' : '';
|
|
101
|
+
}
|
|
102
|
+
return '';
|
|
103
|
+
}, [limitNumber]);
|
|
104
|
+
|
|
105
|
+
const tStatus = useMemo(() => params.status || innerStatus, [params.status, innerStatus]);
|
|
106
|
+
|
|
107
|
+
const onValidateChange = () => {
|
|
108
|
+
params.onValidate?.({
|
|
109
|
+
error: innerStatus ? 'exceed-maximum' : undefined,
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
onValidateChange();
|
|
115
|
+
}, [innerStatus]);
|
|
116
|
+
|
|
117
|
+
return {
|
|
118
|
+
tStatus,
|
|
119
|
+
limitNumber,
|
|
120
|
+
getValueByLimitNumber,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const AlignInputNumber = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
6
|
+
<div style={{ display: "flex", gap: "16px" }}>
|
|
7
|
+
<div>
|
|
8
|
+
<div style={{ marginBottom: "4px", fontSize: "12px", color: "#999" }}>左对齐</div>
|
|
9
|
+
<InputNumber align="left" defaultValue={100} />
|
|
10
|
+
</div>
|
|
11
|
+
<div>
|
|
12
|
+
<div style={{ marginBottom: "4px", fontSize: "12px", color: "#999" }}>居中对齐</div>
|
|
13
|
+
<InputNumber align="center" defaultValue={200} />
|
|
14
|
+
</div>
|
|
15
|
+
<div>
|
|
16
|
+
<div style={{ marginBottom: "4px", fontSize: "12px", color: "#999" }}>右对齐</div>
|
|
17
|
+
<InputNumber align="right" defaultValue={300} />
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
export default AlignInputNumber;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import React, { useState, useMemo } from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
type InputNumberValue = string | number;
|
|
5
|
+
type ErrorType = "exceed-maximum" | "below-minimum";
|
|
6
|
+
|
|
7
|
+
const EventsInputNumber = () => {
|
|
8
|
+
const [value, setValue] = useState<InputNumberValue>(100);
|
|
9
|
+
const [error, setError] = useState<ErrorType>();
|
|
10
|
+
|
|
11
|
+
const tips = useMemo(() => {
|
|
12
|
+
if (error === "exceed-maximum") return "数值不能超过最大值";
|
|
13
|
+
if (error === "below-minimum") return "数值不能小于最小值";
|
|
14
|
+
return undefined;
|
|
15
|
+
}, [error]);
|
|
16
|
+
|
|
17
|
+
const handleChange = (v: InputNumberValue, ctx: any) => {
|
|
18
|
+
console.info("change", v, ctx);
|
|
19
|
+
setValue(v);
|
|
20
|
+
};
|
|
21
|
+
const onValidate = (ctx: { error: ErrorType }) => {
|
|
22
|
+
setError(ctx.error);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
27
|
+
<InputNumber
|
|
28
|
+
value={value}
|
|
29
|
+
max={15}
|
|
30
|
+
min={-2}
|
|
31
|
+
inputProps={{ tips }}
|
|
32
|
+
suffix="个"
|
|
33
|
+
style={{ width: 300 }}
|
|
34
|
+
onChange={handleChange}
|
|
35
|
+
onValidate={onValidate}
|
|
36
|
+
onBlur={(v, ctx) => console.info("blur", v, ctx)}
|
|
37
|
+
onFocus={(v, ctx) => console.info("focus", v, ctx)}
|
|
38
|
+
onEnter={(v, ctx) => console.info("enter", v, ctx)}
|
|
39
|
+
/>
|
|
40
|
+
<div style={{ color: "#666", fontSize: "12px" }}>范围: -2 ~ 15, 查看控制台输出</div>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export default EventsInputNumber;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const FormatInputNumber = () => {
|
|
5
|
+
const [value, setValue] = useState(50);
|
|
6
|
+
const [value2, setValue2] = useState(1000);
|
|
7
|
+
return (
|
|
8
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
9
|
+
<div>
|
|
10
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>百分比格式</div>
|
|
11
|
+
<InputNumber format={(val) => `${val} %`} value={value} onChange={setValue} style={{ width: 250 }} />
|
|
12
|
+
</div>
|
|
13
|
+
<div>
|
|
14
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>货币格式(保留2位小数)</div>
|
|
15
|
+
<InputNumber
|
|
16
|
+
decimalPlaces={2}
|
|
17
|
+
format={(_, { fixedNumber }) => `¥ ${fixedNumber}`}
|
|
18
|
+
value={value2}
|
|
19
|
+
onChange={setValue2}
|
|
20
|
+
style={{ width: 250 }}
|
|
21
|
+
/>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default FormatInputNumber;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const LargeNumberInputNumber = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
6
|
+
<div>
|
|
7
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>大整数</div>
|
|
8
|
+
<InputNumber defaultValue="19999999999999999" largeNumber decimalPlaces={2} step={1} style={{ width: 350 }} />
|
|
9
|
+
</div>
|
|
10
|
+
<div>
|
|
11
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>大小数</div>
|
|
12
|
+
<InputNumber defaultValue="0.8975527383412673418" largeNumber step={0.888} style={{ width: 350 }} />
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
export default LargeNumberInputNumber;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const MinMaxInputNumber = () => {
|
|
5
|
+
const [value, setValue] = useState(5);
|
|
6
|
+
return (
|
|
7
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
8
|
+
<InputNumber min={0} max={10} value={value} onChange={setValue} />
|
|
9
|
+
<div style={{ color: "#666", fontSize: "12px" }}>范围: 0 ~ 10, 当前值: {value}</div>
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default MinMaxInputNumber;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const SizesInputNumber = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
|
|
6
|
+
<div style={{ display: "flex", gap: "16px", alignItems: "flex-start" }}>
|
|
7
|
+
<div>
|
|
8
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>row 主题</div>
|
|
9
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
|
|
10
|
+
<InputNumber size="small" defaultValue={3} />
|
|
11
|
+
<InputNumber size="medium" defaultValue={6} />
|
|
12
|
+
<InputNumber size="large" defaultValue={9} />
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
<div>
|
|
16
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>column 主题</div>
|
|
17
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
|
|
18
|
+
<InputNumber theme="column" size="small" defaultValue={3} />
|
|
19
|
+
<InputNumber theme="column" size="medium" defaultValue={6} />
|
|
20
|
+
<InputNumber theme="column" size="large" defaultValue={9} />
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
<div>
|
|
24
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>normal 主题</div>
|
|
25
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
|
|
26
|
+
<InputNumber theme="normal" size="small" defaultValue={3} />
|
|
27
|
+
<InputNumber theme="normal" size="medium" defaultValue={6} />
|
|
28
|
+
<InputNumber theme="normal" size="large" defaultValue={9} />
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
export default SizesInputNumber;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
import { Form } from "../../form";
|
|
4
|
+
import { Radio } from "../../radio";
|
|
5
|
+
|
|
6
|
+
const { FormItem } = Form;
|
|
7
|
+
|
|
8
|
+
type AlignType = "hide" | "align-left" | "align-input";
|
|
9
|
+
|
|
10
|
+
const StatusInputNumber = () => {
|
|
11
|
+
const [type, setType] = useState<AlignType>("align-input");
|
|
12
|
+
return (
|
|
13
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
14
|
+
<Radio.Group value={type} onChange={(val: AlignType) => setType(val)} variant="default-filled">
|
|
15
|
+
<Radio.Button value="hide">隐藏文本提示</Radio.Button>
|
|
16
|
+
<Radio.Button value="align-left">文本提示左对齐</Radio.Button>
|
|
17
|
+
<Radio.Button value="align-input">文本提示对齐输入框</Radio.Button>
|
|
18
|
+
</Radio.Group>
|
|
19
|
+
|
|
20
|
+
<Form>
|
|
21
|
+
{type === "hide" && (
|
|
22
|
+
<>
|
|
23
|
+
<FormItem label="禁用">
|
|
24
|
+
<InputNumber style={{ width: 300 }} disabled />
|
|
25
|
+
</FormItem>
|
|
26
|
+
<FormItem label="只读">
|
|
27
|
+
<InputNumber style={{ width: 300 }} readonly />
|
|
28
|
+
</FormItem>
|
|
29
|
+
<FormItem label="正常">
|
|
30
|
+
<InputNumber style={{ width: 300 }} />
|
|
31
|
+
</FormItem>
|
|
32
|
+
<FormItem label="成功">
|
|
33
|
+
<InputNumber style={{ width: 300 }} status="success" />
|
|
34
|
+
</FormItem>
|
|
35
|
+
<FormItem label="警告">
|
|
36
|
+
<InputNumber style={{ width: 300 }} status="warning" />
|
|
37
|
+
</FormItem>
|
|
38
|
+
<FormItem label="错误">
|
|
39
|
+
<InputNumber style={{ width: 300 }} status="error" />
|
|
40
|
+
</FormItem>
|
|
41
|
+
</>
|
|
42
|
+
)}
|
|
43
|
+
|
|
44
|
+
{(type === "align-left" || type === "align-input") && (
|
|
45
|
+
<>
|
|
46
|
+
<FormItem label="正常提示">
|
|
47
|
+
<InputNumber style={{ width: 300 }} tips="这是普通文本提示" />
|
|
48
|
+
</FormItem>
|
|
49
|
+
<FormItem label="成功提示">
|
|
50
|
+
<InputNumber style={{ width: 300 }} status="success" tips="校验通过文本提示" />
|
|
51
|
+
</FormItem>
|
|
52
|
+
<FormItem label="警告提示">
|
|
53
|
+
<InputNumber style={{ width: 300 }} status="warning" tips="校验不通过文本提示" />
|
|
54
|
+
</FormItem>
|
|
55
|
+
<FormItem label="错误提示">
|
|
56
|
+
<InputNumber style={{ width: 300 }} status="error" tips="校验存在严重问题文本提示" />
|
|
57
|
+
</FormItem>
|
|
58
|
+
</>
|
|
59
|
+
)}
|
|
60
|
+
</Form>
|
|
61
|
+
</div>
|
|
62
|
+
);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export default StatusInputNumber;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const StepAndDecimalInputNumber = () => {
|
|
5
|
+
const [value, setValue] = useState(3.2);
|
|
6
|
+
return (
|
|
7
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
8
|
+
<InputNumber step={1.2} decimalPlaces={2} value={value} onChange={setValue} />
|
|
9
|
+
<div style={{ color: "#666", fontSize: "12px" }}>步长: 1.2, 保留2位小数, 当前值: {value}</div>
|
|
10
|
+
</div>
|
|
11
|
+
);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default StepAndDecimalInputNumber;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const ThemesInputNumber = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
|
|
6
|
+
<div>
|
|
7
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>row - 横向按钮(默认)</div>
|
|
8
|
+
<InputNumber theme="row" defaultValue={5} />
|
|
9
|
+
</div>
|
|
10
|
+
<div>
|
|
11
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>column - 纵向按钮</div>
|
|
12
|
+
<InputNumber theme="column" defaultValue={5} />
|
|
13
|
+
</div>
|
|
14
|
+
<div>
|
|
15
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>normal - 无按钮</div>
|
|
16
|
+
<InputNumber theme="normal" defaultValue={5} />
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export default ThemesInputNumber;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import InputNumber from "../index";
|
|
3
|
+
|
|
4
|
+
const WithSuffixInputNumber = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
6
|
+
<InputNumber suffix="个" defaultValue={10} style={{ width: 200 }} />
|
|
7
|
+
<InputNumber suffix="元" defaultValue={100} style={{ width: 200 }} />
|
|
8
|
+
<InputNumber suffix="kg" defaultValue={50} style={{ width: 200 }} />
|
|
9
|
+
</div>
|
|
10
|
+
);
|
|
11
|
+
|
|
12
|
+
export default WithSuffixInputNumber;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import IPInput from "../IPInput";
|
|
3
|
+
import { Button } from "@tendaui/react";
|
|
4
|
+
|
|
5
|
+
const ControlledExample = () => {
|
|
6
|
+
const [value, setValue] = useState("192.168.1.1");
|
|
7
|
+
return (
|
|
8
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "16px" }}>
|
|
9
|
+
<IPInput value={value} onChange={setValue} allowCIDR={true} showClear={true} />
|
|
10
|
+
<div style={{ color: "#666", fontSize: "12px" }}>当前值: {value || "(空)"}</div>
|
|
11
|
+
<div style={{ display: "flex", gap: "8px", flexWrap: "wrap" }}>
|
|
12
|
+
<Button size="small" onClick={() => setValue("10.0.0.1")}>
|
|
13
|
+
设为 10.0.0.1
|
|
14
|
+
</Button>
|
|
15
|
+
<Button size="small" onClick={() => setValue("172.16.0.1/24")}>
|
|
16
|
+
设为 172.16.0.1/24
|
|
17
|
+
</Button>
|
|
18
|
+
<Button size="small" onClick={() => setValue("")}>
|
|
19
|
+
清空
|
|
20
|
+
</Button>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export default ControlledExample;
|