@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,25 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Tabs, TabPanel } from "../index";
|
|
3
|
+
|
|
4
|
+
const LazyExample = () => {
|
|
5
|
+
const [activeTab, setActiveTab] = useState("tab1");
|
|
6
|
+
|
|
7
|
+
return (
|
|
8
|
+
<div>
|
|
9
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>懒加载模式下,只有在选项卡被激活时才会渲染内容</div>
|
|
10
|
+
<Tabs value={activeTab} onChange={(val) => setActiveTab(val as string)}>
|
|
11
|
+
<TabPanel label="选项卡一" value="tab1" lazy>
|
|
12
|
+
<div style={{ padding: "16px" }}>选项卡一的内容(懒加载)</div>
|
|
13
|
+
</TabPanel>
|
|
14
|
+
<TabPanel label="选项卡二" value="tab2" lazy>
|
|
15
|
+
<div style={{ padding: "16px" }}>选项卡二的内容(懒加载)</div>
|
|
16
|
+
</TabPanel>
|
|
17
|
+
<TabPanel label="选项卡三" value="tab3" lazy>
|
|
18
|
+
<div style={{ padding: "16px" }}>选项卡三的内容(懒加载)</div>
|
|
19
|
+
</TabPanel>
|
|
20
|
+
</Tabs>
|
|
21
|
+
</div>
|
|
22
|
+
);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export default LazyExample;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Tabs, TabPanel } from "../index";
|
|
3
|
+
|
|
4
|
+
const PlacementExample = () => {
|
|
5
|
+
const [placement, setPlacement] = useState<"top" | "bottom" | "left" | "right">('top');
|
|
6
|
+
const [activeTab, setActiveTab] = useState("tab1");
|
|
7
|
+
|
|
8
|
+
return (
|
|
9
|
+
<div>
|
|
10
|
+
<div style={{ marginBottom: "16px" }}>
|
|
11
|
+
<span style={{ marginRight: "8px" }}>选项卡位置:</span>
|
|
12
|
+
<select value={placement} onChange={(e) => setPlacement(e.target.value as any)}>
|
|
13
|
+
<option value="top">顶部</option>
|
|
14
|
+
<option value="bottom">底部</option>
|
|
15
|
+
<option value="left">左侧</option>
|
|
16
|
+
<option value="right">右侧</option>
|
|
17
|
+
</select>
|
|
18
|
+
</div>
|
|
19
|
+
<div style={{ height: "200px", border: "1px solid #eee" }}>
|
|
20
|
+
<Tabs value={activeTab} onChange={(val) => setActiveTab(val as string)} placement={placement}>
|
|
21
|
+
<TabPanel label="选项卡一" value="tab1">
|
|
22
|
+
<div style={{ padding: "16px" }}>选项卡一的内容</div>
|
|
23
|
+
</TabPanel>
|
|
24
|
+
<TabPanel label="选项卡二" value="tab2">
|
|
25
|
+
<div style={{ padding: "16px" }}>选项卡二的内容</div>
|
|
26
|
+
</TabPanel>
|
|
27
|
+
<TabPanel label="选项卡三" value="tab3">
|
|
28
|
+
<div style={{ padding: "16px" }}>选项卡三的内容</div>
|
|
29
|
+
</TabPanel>
|
|
30
|
+
</Tabs>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export default PlacementExample;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Tabs, TabPanel } from "../index";
|
|
3
|
+
|
|
4
|
+
const RemovableExample = () => {
|
|
5
|
+
const [activeTab, setActiveTab] = useState("tab1");
|
|
6
|
+
const [tabs, setTabs] = useState([
|
|
7
|
+
{ label: "选项卡一", value: "tab1" },
|
|
8
|
+
{ label: "选项卡二", value: "tab2" },
|
|
9
|
+
{ label: "选项卡三", value: "tab3" }
|
|
10
|
+
]);
|
|
11
|
+
|
|
12
|
+
const handleRemove = (options: { value: string | number; index: number }) => {
|
|
13
|
+
const newTabs = tabs.filter((tab) => tab.value !== options.value);
|
|
14
|
+
setTabs(newTabs);
|
|
15
|
+
if (activeTab === options.value && newTabs.length > 0) {
|
|
16
|
+
setActiveTab(newTabs[0].value);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<Tabs value={activeTab} onChange={(val) => setActiveTab(val as string)} onRemove={handleRemove}>
|
|
22
|
+
{tabs.map((tab) => (
|
|
23
|
+
<TabPanel key={tab.value} label={tab.label} value={tab.value} removable>
|
|
24
|
+
<div style={{ padding: "16px" }}>{tab.label} 的内容</div>
|
|
25
|
+
</TabPanel>
|
|
26
|
+
))}
|
|
27
|
+
</Tabs>
|
|
28
|
+
);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export default RemovableExample;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Tabs, TabPanel } from "../index";
|
|
3
|
+
|
|
4
|
+
const SizesExample = () => (
|
|
5
|
+
<div style={{ display: "flex", flexDirection: "column", gap: "24px" }}>
|
|
6
|
+
<div>
|
|
7
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>中尺寸(默认)</div>
|
|
8
|
+
<Tabs defaultValue="tab1" size="medium">
|
|
9
|
+
<TabPanel label="选项卡一" value="tab1">
|
|
10
|
+
<div style={{ padding: "16px" }}>中尺寸内容</div>
|
|
11
|
+
</TabPanel>
|
|
12
|
+
<TabPanel label="选项卡二" value="tab2">
|
|
13
|
+
<div style={{ padding: "16px" }}>中尺寸内容</div>
|
|
14
|
+
</TabPanel>
|
|
15
|
+
</Tabs>
|
|
16
|
+
</div>
|
|
17
|
+
<div>
|
|
18
|
+
<div style={{ marginBottom: "8px", color: "#666" }}>大尺寸</div>
|
|
19
|
+
<Tabs defaultValue="tab1" size="large">
|
|
20
|
+
<TabPanel label="选项卡一" value="tab1">
|
|
21
|
+
<div style={{ padding: "16px" }}>大尺寸内容</div>
|
|
22
|
+
</TabPanel>
|
|
23
|
+
<TabPanel label="选项卡二" value="tab2">
|
|
24
|
+
<div style={{ padding: "16px" }}>大尺寸内容</div>
|
|
25
|
+
</TabPanel>
|
|
26
|
+
</Tabs>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
export default SizesExample;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React, { useState } from "react";
|
|
2
|
+
import { Tabs, TabPanel } from "../index";
|
|
3
|
+
|
|
4
|
+
const WithActionExample = () => {
|
|
5
|
+
const [activeTab, setActiveTab] = useState("tab1");
|
|
6
|
+
|
|
7
|
+
return (
|
|
8
|
+
<Tabs
|
|
9
|
+
value={activeTab}
|
|
10
|
+
onChange={(val) => setActiveTab(val as string)}
|
|
11
|
+
action={<button style={{ marginRight: "8px", cursor: "pointer" }}>操作按钮</button>}
|
|
12
|
+
>
|
|
13
|
+
<TabPanel label="选项卡一" value="tab1">
|
|
14
|
+
<div style={{ padding: "16px" }}>选项卡一的内容</div>
|
|
15
|
+
</TabPanel>
|
|
16
|
+
<TabPanel label="选项卡二" value="tab2">
|
|
17
|
+
<div style={{ padding: "16px" }}>选项卡二的内容</div>
|
|
18
|
+
</TabPanel>
|
|
19
|
+
<TabPanel label="选项卡三" value="tab3">
|
|
20
|
+
<div style={{ padding: "16px" }}>选项卡三的内容</div>
|
|
21
|
+
</TabPanel>
|
|
22
|
+
</Tabs>
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export default WithActionExample;
|
package/table/Cell.tsx
CHANGED
|
@@ -3,6 +3,7 @@ import classNames from "classnames";
|
|
|
3
3
|
import { isFunction, get } from "lodash-es";
|
|
4
4
|
import useConfig from "../hooks/useConfig";
|
|
5
5
|
import { BaseTableCellParams, TableRowData } from "./type";
|
|
6
|
+
import Ellipsis from "./Ellipsis";
|
|
6
7
|
|
|
7
8
|
export interface CellProps<T extends TableRowData = TableRowData> {
|
|
8
9
|
cellParams: BaseTableCellParams<T>;
|
|
@@ -58,13 +59,9 @@ const Cell = <T extends TableRowData = TableRowData>(props: CellProps<T>) => {
|
|
|
58
59
|
// 处理省略文本
|
|
59
60
|
const isEllipsis = Boolean(col.ellipsis);
|
|
60
61
|
const cellContent = isEllipsis ? (
|
|
61
|
-
<
|
|
62
|
-
className={`${classPrefix}-table__ellipsis`}
|
|
63
|
-
title={String(cellNode)}
|
|
64
|
-
style={{ width: "100%", overflow: "hidden" }}
|
|
65
|
-
>
|
|
62
|
+
<Ellipsis classPrefix={classPrefix}>
|
|
66
63
|
{cellNode}
|
|
67
|
-
</
|
|
64
|
+
</Ellipsis>
|
|
68
65
|
) : (
|
|
69
66
|
cellNode
|
|
70
67
|
);
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import React, { useRef, useState, MouseEvent } from "react";
|
|
2
|
+
import classNames from "classnames";
|
|
3
|
+
|
|
4
|
+
import type { TNode } from "../common";
|
|
5
|
+
import { isNodeOverflow } from "../_util/scroll";
|
|
6
|
+
import { Tooltip } from "@tendaui/react";
|
|
7
|
+
import useDebounce from "../hooks/useDebounce";
|
|
8
|
+
|
|
9
|
+
export interface EllipsisProps {
|
|
10
|
+
content?: string | TNode;
|
|
11
|
+
children?: string | TNode;
|
|
12
|
+
popupContent?: string | number | TNode;
|
|
13
|
+
placement?: string;
|
|
14
|
+
attach?: () => HTMLElement;
|
|
15
|
+
tooltipProps?: any;
|
|
16
|
+
zIndex?: number;
|
|
17
|
+
overlayClassName?: string;
|
|
18
|
+
classPrefix?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** 超出省略显示 */
|
|
22
|
+
export default function Ellipsis(props: EllipsisProps) {
|
|
23
|
+
const { classPrefix = "td" } = props;
|
|
24
|
+
const root = useRef<HTMLDivElement>(null);
|
|
25
|
+
const [isOverflow, setIsOverflow] = useState(false);
|
|
26
|
+
|
|
27
|
+
const ellipsisClasses = classNames([`${classPrefix}-table__ellipsis`, `${classPrefix}-text-ellipsis`]);
|
|
28
|
+
|
|
29
|
+
const innerEllipsisClassName: any = [`${classPrefix}-table__ellipsis-content`, props.overlayClassName];
|
|
30
|
+
|
|
31
|
+
// 当表格数据量大时,不希望默认渲染全量的 Popup,期望在用户 mouseenter 的时候再显示
|
|
32
|
+
const onTriggerMouseenter = () => {
|
|
33
|
+
if (!root.current) return;
|
|
34
|
+
setIsOverflow(isNodeOverflow(root.current));
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const onTriggerMouseleave = () => {
|
|
38
|
+
setIsOverflow(isNodeOverflow(root.current));
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// 使用 debounce 有两个原因:1. 避免 safari/firefox 等浏览器不显示省略浮层;2. 避免省略列快速滚动时,出现一堆的省略浮层
|
|
42
|
+
const onMouseAround = useDebounce((e: MouseEvent<HTMLDivElement>) => {
|
|
43
|
+
e.type === "mouseleave" ? onTriggerMouseleave() : onTriggerMouseenter();
|
|
44
|
+
}, 80);
|
|
45
|
+
|
|
46
|
+
const cellNode = props.content || props.children;
|
|
47
|
+
const ellipsisContent = (
|
|
48
|
+
<div ref={root} className={ellipsisClasses} onMouseEnter={onMouseAround} onMouseLeave={onMouseAround}>
|
|
49
|
+
{cellNode}
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
let content = null;
|
|
53
|
+
const { tooltipProps } = props;
|
|
54
|
+
if (isOverflow) {
|
|
55
|
+
const rProps = {
|
|
56
|
+
content: props.popupContent || cellNode,
|
|
57
|
+
destroyOnClose: true,
|
|
58
|
+
zIndex: props.zIndex,
|
|
59
|
+
attach: props.attach,
|
|
60
|
+
placement: props.placement,
|
|
61
|
+
overlayClassName: tooltipProps?.overlayClassName
|
|
62
|
+
? innerEllipsisClassName.concat(tooltipProps.overlayClassName)
|
|
63
|
+
: innerEllipsisClassName,
|
|
64
|
+
...(props.tooltipProps || {})
|
|
65
|
+
};
|
|
66
|
+
content = <Tooltip {...rProps}>{ellipsisContent}</Tooltip>;
|
|
67
|
+
} else {
|
|
68
|
+
content = ellipsisContent;
|
|
69
|
+
}
|
|
70
|
+
return content;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
Ellipsis.displayName = "Ellipsis";
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Table from "../index";
|
|
3
|
+
import type { BaseTableCol, TableRowData } from "../type";
|
|
4
|
+
|
|
5
|
+
// 示例数据类型
|
|
6
|
+
interface UserData extends TableRowData {
|
|
7
|
+
id: number;
|
|
8
|
+
name: string;
|
|
9
|
+
age: number;
|
|
10
|
+
email: string;
|
|
11
|
+
address: string;
|
|
12
|
+
status: "active" | "inactive";
|
|
13
|
+
score: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 基础数据
|
|
17
|
+
const baseData: UserData[] = [
|
|
18
|
+
{
|
|
19
|
+
id: 1,
|
|
20
|
+
name: "张三",
|
|
21
|
+
age: 25,
|
|
22
|
+
email: "zhangsan@example.com",
|
|
23
|
+
address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
|
|
24
|
+
status: "active",
|
|
25
|
+
score: 95
|
|
26
|
+
},
|
|
27
|
+
{ id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
|
|
28
|
+
{ id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
|
|
29
|
+
{ id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
|
|
30
|
+
{ id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const AlignmentExample = () => (
|
|
34
|
+
<Table
|
|
35
|
+
columns={[
|
|
36
|
+
{ colKey: "name", title: "左对齐", width: 120, align: "left" },
|
|
37
|
+
{ colKey: "age", title: "居中", width: 100, align: "center" },
|
|
38
|
+
{ colKey: "score", title: "右对齐", width: 100, align: "right" },
|
|
39
|
+
{ colKey: "email", title: "默认(左对齐)", width: 240 }
|
|
40
|
+
]}
|
|
41
|
+
data={baseData}
|
|
42
|
+
bordered
|
|
43
|
+
/>
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
export default AlignmentExample;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Table from "../index";
|
|
3
|
+
import type { BaseTableCol, TableRowData } from "../type";
|
|
4
|
+
|
|
5
|
+
// 示例数据类型
|
|
6
|
+
interface UserData extends TableRowData {
|
|
7
|
+
id: number;
|
|
8
|
+
name: string;
|
|
9
|
+
age: number;
|
|
10
|
+
email: string;
|
|
11
|
+
address: string;
|
|
12
|
+
status: "active" | "inactive";
|
|
13
|
+
score: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 基础数据
|
|
17
|
+
const baseData: UserData[] = [
|
|
18
|
+
{
|
|
19
|
+
id: 1,
|
|
20
|
+
name: "张三",
|
|
21
|
+
age: 25,
|
|
22
|
+
email: "zhangsan@example.com",
|
|
23
|
+
address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
|
|
24
|
+
status: "active",
|
|
25
|
+
score: 95
|
|
26
|
+
},
|
|
27
|
+
{ id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
|
|
28
|
+
{ id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
|
|
29
|
+
{ id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
|
|
30
|
+
{ id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const AutoWidthExample = () => (
|
|
34
|
+
<Table
|
|
35
|
+
columns={[
|
|
36
|
+
{ colKey: "name", title: "姓名" },
|
|
37
|
+
{ colKey: "age", title: "年龄" },
|
|
38
|
+
{ colKey: "email", title: "邮箱" },
|
|
39
|
+
{ colKey: "address", title: "地址" }
|
|
40
|
+
]}
|
|
41
|
+
data={baseData}
|
|
42
|
+
bordered
|
|
43
|
+
tableLayout="auto"
|
|
44
|
+
/>
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
export default AutoWidthExample;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Table from "../index";
|
|
3
|
+
import type { BaseTableCol, TableRowData } from "../type";
|
|
4
|
+
|
|
5
|
+
// 示例数据类型
|
|
6
|
+
interface UserData extends TableRowData {
|
|
7
|
+
id: number;
|
|
8
|
+
name: string;
|
|
9
|
+
age: number;
|
|
10
|
+
email: string;
|
|
11
|
+
address: string;
|
|
12
|
+
status: "active" | "inactive";
|
|
13
|
+
score: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 基础数据
|
|
17
|
+
const baseColumns: BaseTableCol<UserData>[] = [
|
|
18
|
+
{ colKey: "name", title: "姓名", width: 120 },
|
|
19
|
+
{ colKey: "age", title: "年龄", width: 80, align: "center" },
|
|
20
|
+
{ colKey: "email", title: "邮箱", width: 240 },
|
|
21
|
+
{ colKey: "address", title: "地址" }
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const baseData: UserData[] = [
|
|
25
|
+
{
|
|
26
|
+
id: 1,
|
|
27
|
+
name: "张三",
|
|
28
|
+
age: 25,
|
|
29
|
+
email: "zhangsan@example.com",
|
|
30
|
+
address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
|
|
31
|
+
status: "active",
|
|
32
|
+
score: 95
|
|
33
|
+
},
|
|
34
|
+
{ id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
|
|
35
|
+
{ id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
|
|
36
|
+
{ id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
|
|
37
|
+
{ id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const BorderedStripeHoverExample = () => <Table columns={baseColumns} data={baseData} bordered stripe hover />;
|
|
41
|
+
|
|
42
|
+
export default BorderedStripeHoverExample;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Table from "../index";
|
|
3
|
+
import type { BaseTableCol, TableRowData } from "../type";
|
|
4
|
+
|
|
5
|
+
// 示例数据类型
|
|
6
|
+
interface UserData extends TableRowData {
|
|
7
|
+
id: number;
|
|
8
|
+
name: string;
|
|
9
|
+
age: number;
|
|
10
|
+
email: string;
|
|
11
|
+
address: string;
|
|
12
|
+
status: "active" | "inactive";
|
|
13
|
+
score: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 基础数据
|
|
17
|
+
const baseColumns: BaseTableCol<UserData>[] = [
|
|
18
|
+
{ colKey: "name", title: "姓名", width: 120 },
|
|
19
|
+
{ colKey: "age", title: "年龄", width: 80, align: "center" },
|
|
20
|
+
{ colKey: "email", title: "邮箱", width: 240 },
|
|
21
|
+
{ colKey: "address", title: "地址" }
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const baseData: UserData[] = [
|
|
25
|
+
{
|
|
26
|
+
id: 1,
|
|
27
|
+
name: "张三",
|
|
28
|
+
age: 25,
|
|
29
|
+
email: "zhangsan@example.com",
|
|
30
|
+
address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
|
|
31
|
+
status: "active",
|
|
32
|
+
score: 95
|
|
33
|
+
},
|
|
34
|
+
{ id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
|
|
35
|
+
{ id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
|
|
36
|
+
{ id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
|
|
37
|
+
{ id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const BorderedExample = () => <Table columns={baseColumns} data={baseData} bordered />;
|
|
41
|
+
|
|
42
|
+
export default BorderedExample;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Table from "../index";
|
|
3
|
+
import type { BaseTableCol, TableRowData } from "../type";
|
|
4
|
+
|
|
5
|
+
// 示例数据类型
|
|
6
|
+
interface UserData extends TableRowData {
|
|
7
|
+
id: number;
|
|
8
|
+
name: string;
|
|
9
|
+
age: number;
|
|
10
|
+
email: string;
|
|
11
|
+
address: string;
|
|
12
|
+
status: "active" | "inactive";
|
|
13
|
+
score: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 基础数据
|
|
17
|
+
const baseColumns: BaseTableCol<UserData>[] = [
|
|
18
|
+
{ colKey: "name", title: "姓名", width: 120 },
|
|
19
|
+
{ colKey: "age", title: "年龄", width: 80, align: "center" },
|
|
20
|
+
{ colKey: "email", title: "邮箱", width: 240 },
|
|
21
|
+
{ colKey: "address", title: "地址" }
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const baseData: UserData[] = [
|
|
25
|
+
{
|
|
26
|
+
id: 1,
|
|
27
|
+
name: "张三",
|
|
28
|
+
age: 25,
|
|
29
|
+
email: "zhangsan@example.com",
|
|
30
|
+
address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
|
|
31
|
+
status: "active",
|
|
32
|
+
score: 95
|
|
33
|
+
},
|
|
34
|
+
{ id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
|
|
35
|
+
{ id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
|
|
36
|
+
{ id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
|
|
37
|
+
{ id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
|
|
38
|
+
];
|
|
39
|
+
|
|
40
|
+
const CellClickExample = () => (
|
|
41
|
+
<Table
|
|
42
|
+
columns={baseColumns}
|
|
43
|
+
data={baseData}
|
|
44
|
+
bordered
|
|
45
|
+
onCellClick={({ row, col, rowIndex, colIndex }) => {
|
|
46
|
+
console.log("点击单元格:", { row, col, rowIndex, colIndex });
|
|
47
|
+
window.alert(`点击了第 ${rowIndex + 1} 行,第 ${colIndex + 1} 列,值:${row[col.colKey]}`);
|
|
48
|
+
}}
|
|
49
|
+
/>
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
export default CellClickExample;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Table from "../index";
|
|
3
|
+
import type { BaseTableCol, TableRowData } from "../type";
|
|
4
|
+
|
|
5
|
+
// 示例数据类型
|
|
6
|
+
interface UserData extends TableRowData {
|
|
7
|
+
id: number;
|
|
8
|
+
name: string;
|
|
9
|
+
age: number;
|
|
10
|
+
email: string;
|
|
11
|
+
address: string;
|
|
12
|
+
status: "active" | "inactive";
|
|
13
|
+
score: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 基础数据
|
|
17
|
+
const baseData: UserData[] = [
|
|
18
|
+
{
|
|
19
|
+
id: 1,
|
|
20
|
+
name: "张三",
|
|
21
|
+
age: 25,
|
|
22
|
+
email: "zhangsan@example.com",
|
|
23
|
+
address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
|
|
24
|
+
status: "active",
|
|
25
|
+
score: 95
|
|
26
|
+
},
|
|
27
|
+
{ id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
|
|
28
|
+
{ id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
|
|
29
|
+
{ id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
|
|
30
|
+
{ id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const ComplexExample = () => (
|
|
34
|
+
<Table
|
|
35
|
+
columns={[
|
|
36
|
+
{ colKey: "name", title: "姓名", width: 120 },
|
|
37
|
+
{ colKey: "age", title: "年龄", width: 80, align: "center" },
|
|
38
|
+
{
|
|
39
|
+
colKey: "status",
|
|
40
|
+
title: "状态",
|
|
41
|
+
width: 100,
|
|
42
|
+
align: "center",
|
|
43
|
+
cell: ({ row }) => (
|
|
44
|
+
<span
|
|
45
|
+
style={{
|
|
46
|
+
color: row.status === "active" ? "#52c41a" : "#ff4d4f",
|
|
47
|
+
fontWeight: "bold"
|
|
48
|
+
}}
|
|
49
|
+
>
|
|
50
|
+
{row.status === "active" ? "✓ 活跃" : "✗ 非活跃"}
|
|
51
|
+
</span>
|
|
52
|
+
)
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
colKey: "score",
|
|
56
|
+
title: "分数",
|
|
57
|
+
width: 120,
|
|
58
|
+
align: "right",
|
|
59
|
+
cell: ({ row }) => (
|
|
60
|
+
<span style={{ color: row.score >= 90 ? "#1890ff" : "#666", fontWeight: "bold" }}>{row.score} 分</span>
|
|
61
|
+
)
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
colKey: "email",
|
|
65
|
+
title: "邮箱",
|
|
66
|
+
width: 200,
|
|
67
|
+
ellipsis: true
|
|
68
|
+
},
|
|
69
|
+
{ colKey: "address", title: "地址", width: 250, ellipsis: true }
|
|
70
|
+
]}
|
|
71
|
+
data={baseData}
|
|
72
|
+
bordered
|
|
73
|
+
stripe
|
|
74
|
+
hover
|
|
75
|
+
size="medium"
|
|
76
|
+
onRowClick={({ row }) => {
|
|
77
|
+
console.log("点击行:", row);
|
|
78
|
+
}}
|
|
79
|
+
/>
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
export default ComplexExample;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Table from "../index";
|
|
3
|
+
import type { BaseTableCol, TableRowData } from "../type";
|
|
4
|
+
|
|
5
|
+
// 示例数据类型
|
|
6
|
+
interface UserData extends TableRowData {
|
|
7
|
+
id: number;
|
|
8
|
+
name: string;
|
|
9
|
+
age: number;
|
|
10
|
+
email: string;
|
|
11
|
+
address: string;
|
|
12
|
+
status: "active" | "inactive";
|
|
13
|
+
score: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 基础数据
|
|
17
|
+
const baseData: UserData[] = [
|
|
18
|
+
{
|
|
19
|
+
id: 1,
|
|
20
|
+
name: "张三",
|
|
21
|
+
age: 25,
|
|
22
|
+
email: "zhangsan@example.com",
|
|
23
|
+
address: "北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区北京市朝阳区",
|
|
24
|
+
status: "active",
|
|
25
|
+
score: 95
|
|
26
|
+
},
|
|
27
|
+
{ id: 2, name: "李四", age: 30, email: "lisi@example.com", address: "上海市浦东新区", status: "active", score: 88 },
|
|
28
|
+
{ id: 3, name: "王五", age: 28, email: "wangwu@example.com", address: "广州市天河区", status: "inactive", score: 92 },
|
|
29
|
+
{ id: 4, name: "赵六", age: 35, email: "zhaoliu@example.com", address: "深圳市南山区", status: "active", score: 87 },
|
|
30
|
+
{ id: 5, name: "钱七", age: 22, email: "qianqi@example.com", address: "杭州市西湖区", status: "inactive", score: 90 }
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
const CustomCellExample = () => (
|
|
34
|
+
<Table
|
|
35
|
+
columns={[
|
|
36
|
+
{ colKey: "name", title: "姓名", width: 120 },
|
|
37
|
+
{
|
|
38
|
+
colKey: "status",
|
|
39
|
+
title: "状态",
|
|
40
|
+
width: 100,
|
|
41
|
+
align: "center",
|
|
42
|
+
cell: ({ row }) => (
|
|
43
|
+
<span
|
|
44
|
+
style={{
|
|
45
|
+
color: row.status === "active" ? "#52c41a" : "#ff4d4f",
|
|
46
|
+
fontWeight: "bold"
|
|
47
|
+
}}
|
|
48
|
+
>
|
|
49
|
+
{row.status === "active" ? "活跃" : "非活跃"}
|
|
50
|
+
</span>
|
|
51
|
+
)
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
colKey: "score",
|
|
55
|
+
title: "分数",
|
|
56
|
+
width: 100,
|
|
57
|
+
align: "center",
|
|
58
|
+
cell: ({ row }) => <span style={{ color: row.score >= 90 ? "#1890ff" : "#666" }}>{row.score}</span>
|
|
59
|
+
},
|
|
60
|
+
{ colKey: "email", title: "邮箱", width: 240 },
|
|
61
|
+
{ colKey: "address", title: "地址" }
|
|
62
|
+
]}
|
|
63
|
+
data={baseData}
|
|
64
|
+
bordered
|
|
65
|
+
/>
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
export default CustomCellExample;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import Table from "../index";
|
|
3
|
+
import type { BaseTableCol, TableRowData } from "../type";
|
|
4
|
+
|
|
5
|
+
// 示例数据类型
|
|
6
|
+
interface UserData extends TableRowData {
|
|
7
|
+
id: number;
|
|
8
|
+
name: string;
|
|
9
|
+
age: number;
|
|
10
|
+
email: string;
|
|
11
|
+
address: string;
|
|
12
|
+
status: "active" | "inactive";
|
|
13
|
+
score: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// 基础数据
|
|
17
|
+
const baseColumns: BaseTableCol<UserData>[] = [
|
|
18
|
+
{ colKey: "name", title: "姓名", width: 120 },
|
|
19
|
+
{ colKey: "age", title: "年龄", width: 80, align: "center" },
|
|
20
|
+
{ colKey: "email", title: "邮箱", width: 240 },
|
|
21
|
+
{ colKey: "address", title: "地址" }
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const CustomEmptyExample = () => (
|
|
25
|
+
<Table
|
|
26
|
+
columns={baseColumns}
|
|
27
|
+
data={[]}
|
|
28
|
+
empty={
|
|
29
|
+
<div style={{ padding: "40px", textAlign: "center", color: "#999" }}>
|
|
30
|
+
<div style={{ fontSize: "48px", marginBottom: "16px" }}>📭</div>
|
|
31
|
+
<div>暂无数据,请稍后再试</div>
|
|
32
|
+
</div>
|
|
33
|
+
}
|
|
34
|
+
/>
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
export default CustomEmptyExample;
|