diff --git a/src/packages/address/__test__/__snapshots__/address.spec.tsx.snap b/src/packages/address/__test__/__snapshots__/address.spec.tsx.snap
index 6411be1560..2bc3b6fea9 100644
--- a/src/packages/address/__test__/__snapshots__/address.spec.tsx.snap
+++ b/src/packages/address/__test__/__snapshots__/address.spec.tsx.snap
@@ -2,6 +2,6 @@
exports[`Address: exist defaultIcon & selectIcon 1`] = `"
"`;
-exports[`Address: show custom 1`] = `""`;
+exports[`Address: show custom 1`] = `""`;
exports[`Address: show exist 1`] = `""`;
diff --git a/src/packages/cascader/__tests__/__snapshots__/cascader.spec.tsx.snap b/src/packages/cascader/__tests__/__snapshots__/cascader.spec.tsx.snap
index db50b5b19b..38332c347d 100644
--- a/src/packages/cascader/__tests__/__snapshots__/cascader.spec.tsx.snap
+++ b/src/packages/cascader/__tests__/__snapshots__/cascader.spec.tsx.snap
@@ -25,7 +25,7 @@ exports[`Cascader > visible true 1`] = `
class="nut-tabs nut-tabs-horizontal"
>
{!disabled && children}
- ) : null
+ return children &&
{!disabled && children}
}
diff --git a/src/packages/tabpane/tabpane.tsx b/src/packages/tabpane/tabpane.tsx
index 45c000ae0f..2759b54435 100644
--- a/src/packages/tabpane/tabpane.tsx
+++ b/src/packages/tabpane/tabpane.tsx
@@ -37,7 +37,5 @@ export const TabPane: FunctionComponent<
className
)
- return children ? (
-
{!disabled && children}
- ) : null
+ return children &&
{!disabled && children}
}
diff --git a/src/packages/tabs/__test__/tabs.spec.tsx b/src/packages/tabs/__test__/tabs.spec.tsx
index 466c1c068e..ab4cf73f94 100644
--- a/src/packages/tabs/__test__/tabs.spec.tsx
+++ b/src/packages/tabs/__test__/tabs.spec.tsx
@@ -7,7 +7,7 @@ import { TabPane } from '../../tabpane/tabpane'
test('base Tabs', () => {
const { getByTestId } = render(
- Tab 1
+ Tab longitem
)
expect(getByTestId('tabs1')).toHaveClass('nut-tabs')
@@ -16,8 +16,8 @@ test('base Tabs', () => {
test('base tabs props', () => {
const { container } = render(
-
- Tab 1
+
+ Tab longitem
)
@@ -26,14 +26,13 @@ test('base tabs props', () => {
expect(el2.length > 0).toBe(true)
expect(el3).toHaveClass('nut-tabs-titles-smile')
- expect(el3).toHaveClass('nut-tabs-titles-scrollable')
})
test('base tabs props', () => {
const { container } = render(
-
- Tab 1
+
+ Tab longitem
)
@@ -44,7 +43,7 @@ test('base tabs props', () => {
test('base other props', async () => {
const { container } = render(
- Tab 1
+ Tab longitem
Tab 2
)
@@ -71,8 +70,8 @@ test('base other props', async () => {
test('base Tabpane Props', () => {
const { container } = render(
-
- Tab 1
+
+ Tab longitem
Tab 2
@@ -87,14 +86,14 @@ test('base Tabpane Props', () => {
expect(el.length === 3).toBe(true)
expect(el[0]).toHaveClass('nut-tabs-titles-item-active')
expect(el[1]).toHaveClass('nut-tabs-titles-item-disabled')
- expect(el2[0]).toHaveTextContent('Tab 1')
+ expect(el2[0]).toHaveTextContent('Tab longitem')
})
test('base Tabpane autoHeight Props', () => {
const { container } = render(
-
- Tab 1
+
+ Tab longitem
Tab 2
@@ -120,8 +119,8 @@ test('base click', () => {
const handleClick = vi.fn(() => {})
const { container } = render(
-
- Tab 1
+
+ Tab longitem
Tab 2
@@ -145,8 +144,8 @@ test('click tab when have many tabs', async () => {
const handleClick = vi.fn(() => {})
const { container } = render(
-
- Tab 1
+
+ Tab longitem
Tab 2
@@ -154,8 +153,8 @@ test('click tab when have many tabs', async () => {
Tab 3
-
- Tab 11
+
+ Tab longitem1
Tab 22
diff --git a/src/packages/tabs/demos/h5/demo1.tsx b/src/packages/tabs/demos/h5/demo1.tsx
index 4c99db304d..6dd7500c59 100644
--- a/src/packages/tabs/demos/h5/demo1.tsx
+++ b/src/packages/tabs/demos/h5/demo1.tsx
@@ -11,7 +11,7 @@ const Demo1 = () => {
setTab1value(value)
}}
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo10.tsx b/src/packages/tabs/demos/h5/demo10.tsx
index ad6c8d1e78..ee55a278cd 100644
--- a/src/packages/tabs/demos/h5/demo10.tsx
+++ b/src/packages/tabs/demos/h5/demo10.tsx
@@ -13,7 +13,7 @@ const Demo10 = () => {
setTab1value(value)
}}
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo11.tsx b/src/packages/tabs/demos/h5/demo11.tsx
index da81377081..eeb5e367f8 100644
--- a/src/packages/tabs/demos/h5/demo11.tsx
+++ b/src/packages/tabs/demos/h5/demo11.tsx
@@ -11,8 +11,8 @@ const Demo11 = () => {
setTab2value(value)
}}
>
-
- Tab 1
+
+ Tab longitem
Tab 2
diff --git a/src/packages/tabs/demos/h5/demo12.tsx b/src/packages/tabs/demos/h5/demo12.tsx
index 2090a35f27..c5f1168519 100644
--- a/src/packages/tabs/demos/h5/demo12.tsx
+++ b/src/packages/tabs/demos/h5/demo12.tsx
@@ -14,7 +14,7 @@ const Demo12 = () => {
setTabIndex(page)
}}
>
-
+
@@ -28,7 +28,7 @@ const Demo12 = () => {
}}
>
- Tab 1
+ Tab longitem
Tab 2
diff --git a/src/packages/tabs/demos/h5/demo13.tsx b/src/packages/tabs/demos/h5/demo13.tsx
index 83d87c7662..fcb028e5f5 100644
--- a/src/packages/tabs/demos/h5/demo13.tsx
+++ b/src/packages/tabs/demos/h5/demo13.tsx
@@ -13,16 +13,16 @@ const Demo13 = () => {
setTab2value(value)
}}
>
-
- Tab 1
- Tab 1
- Tab 1
- Tab 1
- Tab 1
- Tab 1
- Tab 1
- Tab 1
- Tab 1
+
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
Tab 2
diff --git a/src/packages/tabs/demos/h5/demo14.tsx b/src/packages/tabs/demos/h5/demo14.tsx
index b1a544f802..e070e667ce 100644
--- a/src/packages/tabs/demos/h5/demo14.tsx
+++ b/src/packages/tabs/demos/h5/demo14.tsx
@@ -12,11 +12,11 @@ const Demo14 = () => {
setTab2value(value)
}}
>
-
- Tab 1
- Tab 1
- Tab 1
- Tab 1
+
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo16.tsx b/src/packages/tabs/demos/h5/demo16.tsx
index e0f10247c6..56b255e2d2 100644
--- a/src/packages/tabs/demos/h5/demo16.tsx
+++ b/src/packages/tabs/demos/h5/demo16.tsx
@@ -11,6 +11,7 @@ const Demo16 = () => {
setTab4value(value)
}}
>
+ 第一名top1
低阶特卖
上新日
百亿补贴
diff --git a/src/packages/tabs/demos/h5/demo2.tsx b/src/packages/tabs/demos/h5/demo2.tsx
index e24c074c52..b4f9f56a42 100644
--- a/src/packages/tabs/demos/h5/demo2.tsx
+++ b/src/packages/tabs/demos/h5/demo2.tsx
@@ -12,7 +12,7 @@ const Demo2 = () => {
}}
activeType="smile"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo20.tsx b/src/packages/tabs/demos/h5/demo20.tsx
index 2b2c7c458c..5c74767808 100644
--- a/src/packages/tabs/demos/h5/demo20.tsx
+++ b/src/packages/tabs/demos/h5/demo20.tsx
@@ -13,7 +13,7 @@ const Demo20 = () => {
}}
direction="vertical"
>
-
+
{
@@ -21,7 +21,7 @@ const Demo20 = () => {
}}
direction="horizontal"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo21.tsx b/src/packages/tabs/demos/h5/demo21.tsx
index df3f25c65e..891d1c8c7b 100644
--- a/src/packages/tabs/demos/h5/demo21.tsx
+++ b/src/packages/tabs/demos/h5/demo21.tsx
@@ -13,7 +13,7 @@ const Demo21 = () => {
}}
autoHeight
>
-
+
{
@@ -21,7 +21,7 @@ const Demo21 = () => {
}}
direction="vertical"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo22.tsx b/src/packages/tabs/demos/h5/demo22.tsx
index 915423fc59..79f20072eb 100644
--- a/src/packages/tabs/demos/h5/demo22.tsx
+++ b/src/packages/tabs/demos/h5/demo22.tsx
@@ -13,7 +13,7 @@ const Demo22 = () => {
}}
style={{ '--nutui-tabs-titles-font-size': '20px' }}
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
@@ -24,7 +24,7 @@ const Demo22 = () => {
}}
style={{ '--nutui-tabs-titles-font-size': '12px' }}
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo3.tsx b/src/packages/tabs/demos/h5/demo3.tsx
index 4fd622f780..d3f508523c 100644
--- a/src/packages/tabs/demos/h5/demo3.tsx
+++ b/src/packages/tabs/demos/h5/demo3.tsx
@@ -12,7 +12,7 @@ const Demo3 = () => {
}}
activeType="simple"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo4.tsx b/src/packages/tabs/demos/h5/demo4.tsx
index 969e5d2c10..f96d63072e 100644
--- a/src/packages/tabs/demos/h5/demo4.tsx
+++ b/src/packages/tabs/demos/h5/demo4.tsx
@@ -12,7 +12,7 @@ const Demo4 = () => {
}}
activeType="card"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo5.tsx b/src/packages/tabs/demos/h5/demo5.tsx
index ffdd2f1832..a18954d9a5 100644
--- a/src/packages/tabs/demos/h5/demo5.tsx
+++ b/src/packages/tabs/demos/h5/demo5.tsx
@@ -12,7 +12,7 @@ const Demo5 = () => {
}}
activeType="button"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo6.tsx b/src/packages/tabs/demos/h5/demo6.tsx
index e218ab08ce..63d740dbf5 100644
--- a/src/packages/tabs/demos/h5/demo6.tsx
+++ b/src/packages/tabs/demos/h5/demo6.tsx
@@ -12,7 +12,7 @@ const Demo6 = () => {
}}
activeType="divider"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo7.tsx b/src/packages/tabs/demos/h5/demo7.tsx
index 7b92a8a749..8626a9df42 100644
--- a/src/packages/tabs/demos/h5/demo7.tsx
+++ b/src/packages/tabs/demos/h5/demo7.tsx
@@ -12,7 +12,7 @@ const Demo7 = () => {
setTab1value(value)
}}
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo8.tsx b/src/packages/tabs/demos/h5/demo8.tsx
index 6143b08bce..c17875ddc1 100644
--- a/src/packages/tabs/demos/h5/demo8.tsx
+++ b/src/packages/tabs/demos/h5/demo8.tsx
@@ -13,7 +13,7 @@ const Demo8 = () => {
setTab1value(value)
}}
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/h5/demo9.tsx b/src/packages/tabs/demos/h5/demo9.tsx
index 0471484c6a..1e8e992ec7 100644
--- a/src/packages/tabs/demos/h5/demo9.tsx
+++ b/src/packages/tabs/demos/h5/demo9.tsx
@@ -13,7 +13,7 @@ const Demo9 = () => {
setTab1value(value)
}}
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo1.tsx b/src/packages/tabs/demos/taro/demo1.tsx
index 2835e60e88..3fbf547d5a 100644
--- a/src/packages/tabs/demos/taro/demo1.tsx
+++ b/src/packages/tabs/demos/taro/demo1.tsx
@@ -11,7 +11,7 @@ const Demo1 = () => {
setTab1value(value)
}}
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo10.tsx b/src/packages/tabs/demos/taro/demo10.tsx
index 20cda2a1a3..ac6f2bd374 100644
--- a/src/packages/tabs/demos/taro/demo10.tsx
+++ b/src/packages/tabs/demos/taro/demo10.tsx
@@ -13,7 +13,7 @@ const Demo10 = () => {
}}
align="left"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo11.tsx b/src/packages/tabs/demos/taro/demo11.tsx
index ef546e76eb..f39733cfd7 100644
--- a/src/packages/tabs/demos/taro/demo11.tsx
+++ b/src/packages/tabs/demos/taro/demo11.tsx
@@ -11,8 +11,8 @@ const Demo11 = () => {
setTab2value(value)
}}
>
-
- Tab 1
+
+ Tab longitem
Tab 2
diff --git a/src/packages/tabs/demos/taro/demo12.tsx b/src/packages/tabs/demos/taro/demo12.tsx
index 208fa54843..da2f29b22f 100644
--- a/src/packages/tabs/demos/taro/demo12.tsx
+++ b/src/packages/tabs/demos/taro/demo12.tsx
@@ -14,7 +14,7 @@ const Demo12 = () => {
setTabIndex(page)
}}
>
-
+
@@ -28,7 +28,7 @@ const Demo12 = () => {
}}
>
- Tab 1
+ Tab longitem
Tab 2
diff --git a/src/packages/tabs/demos/taro/demo13.tsx b/src/packages/tabs/demos/taro/demo13.tsx
index 475786e378..1077be5582 100644
--- a/src/packages/tabs/demos/taro/demo13.tsx
+++ b/src/packages/tabs/demos/taro/demo13.tsx
@@ -12,15 +12,15 @@ const Demo13 = () => {
setTab2value(value)
}}
>
-
- Tab 1
- Tab 1
- Tab 1
- Tab 1
- Tab 1
- Tab 1
- Tab 1
- Tab 1
+
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
Tab 2
diff --git a/src/packages/tabs/demos/taro/demo14.tsx b/src/packages/tabs/demos/taro/demo14.tsx
index 85790f7f6e..c3d5162b22 100644
--- a/src/packages/tabs/demos/taro/demo14.tsx
+++ b/src/packages/tabs/demos/taro/demo14.tsx
@@ -12,11 +12,11 @@ const Demo14 = () => {
setTab2value(value)
}}
>
-
- Tab 1
- Tab 1
- Tab 1
- Tab 1
+
+ Tab longitem
+ Tab longitem
+ Tab longitem
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo16.tsx b/src/packages/tabs/demos/taro/demo16.tsx
index 2d6f90deb2..2159c2f529 100644
--- a/src/packages/tabs/demos/taro/demo16.tsx
+++ b/src/packages/tabs/demos/taro/demo16.tsx
@@ -11,6 +11,7 @@ const Demo16 = () => {
setTab4value(value)
}}
>
+ 第一名top1
低阶特卖
上新日
百亿补贴
diff --git a/src/packages/tabs/demos/taro/demo2.tsx b/src/packages/tabs/demos/taro/demo2.tsx
index 401008f4e4..c72e3ac5b3 100644
--- a/src/packages/tabs/demos/taro/demo2.tsx
+++ b/src/packages/tabs/demos/taro/demo2.tsx
@@ -12,7 +12,7 @@ const Demo2 = () => {
}}
activeType="smile"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo20.tsx b/src/packages/tabs/demos/taro/demo20.tsx
index 7395364061..3f580ed7f1 100644
--- a/src/packages/tabs/demos/taro/demo20.tsx
+++ b/src/packages/tabs/demos/taro/demo20.tsx
@@ -13,7 +13,7 @@ const Demo20 = () => {
}}
direction="vertical"
>
-
+
{
@@ -21,7 +21,7 @@ const Demo20 = () => {
}}
direction="horizontal"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo21.tsx b/src/packages/tabs/demos/taro/demo21.tsx
index 5bf0a7a54b..d247d1f870 100644
--- a/src/packages/tabs/demos/taro/demo21.tsx
+++ b/src/packages/tabs/demos/taro/demo21.tsx
@@ -13,7 +13,7 @@ const Demo21 = () => {
}}
autoHeight
>
-
+
{
@@ -21,7 +21,7 @@ const Demo21 = () => {
}}
direction="vertical"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo22.tsx b/src/packages/tabs/demos/taro/demo22.tsx
index 20ed7c76fe..e66ef8ad71 100644
--- a/src/packages/tabs/demos/taro/demo22.tsx
+++ b/src/packages/tabs/demos/taro/demo22.tsx
@@ -12,7 +12,7 @@ const Demo22 = () => {
}}
style={{ '--nutui-tabs-titles-font-size': '20px' }}
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
@@ -23,7 +23,7 @@ const Demo22 = () => {
}}
style={{ '--nutui-tabs-titles-font-size': '12px' }}
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo3.tsx b/src/packages/tabs/demos/taro/demo3.tsx
index 5f3e6ce2e9..66c20da15f 100644
--- a/src/packages/tabs/demos/taro/demo3.tsx
+++ b/src/packages/tabs/demos/taro/demo3.tsx
@@ -12,7 +12,7 @@ const Demo3 = () => {
}}
activeType="simple"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo4.tsx b/src/packages/tabs/demos/taro/demo4.tsx
index e6396ad698..eff2a0f769 100644
--- a/src/packages/tabs/demos/taro/demo4.tsx
+++ b/src/packages/tabs/demos/taro/demo4.tsx
@@ -12,7 +12,7 @@ const Demo4 = () => {
}}
activeType="card"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo5.tsx b/src/packages/tabs/demos/taro/demo5.tsx
index dacdb8b418..ee31b5c29b 100644
--- a/src/packages/tabs/demos/taro/demo5.tsx
+++ b/src/packages/tabs/demos/taro/demo5.tsx
@@ -12,7 +12,7 @@ const Demo5 = () => {
}}
activeType="button"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo6.tsx b/src/packages/tabs/demos/taro/demo6.tsx
index cd26844a65..5f379ccd72 100644
--- a/src/packages/tabs/demos/taro/demo6.tsx
+++ b/src/packages/tabs/demos/taro/demo6.tsx
@@ -12,7 +12,7 @@ const Demo6 = () => {
}}
activeType="divider"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo7.tsx b/src/packages/tabs/demos/taro/demo7.tsx
index 2d08cbd704..b3ec27e81f 100644
--- a/src/packages/tabs/demos/taro/demo7.tsx
+++ b/src/packages/tabs/demos/taro/demo7.tsx
@@ -12,7 +12,7 @@ const Demo7 = () => {
}}
align="left"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo8.tsx b/src/packages/tabs/demos/taro/demo8.tsx
index 686413269b..1b2710fc1a 100644
--- a/src/packages/tabs/demos/taro/demo8.tsx
+++ b/src/packages/tabs/demos/taro/demo8.tsx
@@ -13,7 +13,7 @@ const Demo8 = () => {
}}
align="left"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/demos/taro/demo9.tsx b/src/packages/tabs/demos/taro/demo9.tsx
index 9bf81d3beb..bb1d815098 100644
--- a/src/packages/tabs/demos/taro/demo9.tsx
+++ b/src/packages/tabs/demos/taro/demo9.tsx
@@ -13,7 +13,7 @@ const Demo9 = () => {
}}
align="left"
>
- Tab 1
+ Tab longitem
Tab 2
Tab 3
diff --git a/src/packages/tabs/tabs.scss b/src/packages/tabs/tabs.scss
index afb99ec2e0..7379053ef3 100644
--- a/src/packages/tabs/tabs.scss
+++ b/src/packages/tabs/tabs.scss
@@ -5,12 +5,17 @@
display: flex;
}
+.nut-tabs-horizontal {
+ flex-direction: column;
+}
+
.nut-tabs-titles {
display: flex;
box-sizing: border-box;
height: $tabs-titles-height;
user-select: none;
- overflow: hidden;
+ overflow-x: auto;
+ overflow-y: hidden;
background: $tabs-titles-background-color;
scrollbar-width: none;
@@ -22,7 +27,6 @@
.nut-tabs-list {
width: 100%;
- height: auto;
display: flex;
flex-shrink: 0;
}
@@ -41,11 +45,6 @@
}
}
- &-scrollable {
- overflow-x: auto;
- overflow-y: hidden;
- }
-
&-item {
position: relative;
display: flex;
@@ -61,13 +60,17 @@
text-overflow: ellipsis;
white-space: nowrap;
+ .nut-icon {
+ color: $tabs-titles-item-color;
+ }
+
&-left,
&-right {
flex: none;
}
&-text {
- text-align: center;
+ color: $tabs-titles-item-color;
}
&-smile,
@@ -77,9 +80,9 @@
width: 0;
height: 0;
content: ' ';
- bottom: $tabs-tab-line-bottom;
left: 50%;
transform: translate(-50%, 0);
+ bottom: $tabs-tab-line-bottom;
border-radius: $tabs-tab-line-border-radius;
opacity: $tabs-tab-line-opacity;
overflow: hidden;
@@ -93,13 +96,18 @@
font-size: 20px;
width: 100%;
height: 100%;
- color: $color-primary;
}
}
&-active {
- color: $tabs-titles-item-active-color;
- font-weight: $tabs-titles-item-active-font-weight;
+ .nut-icon {
+ color: $tabs-titles-item-active-color;
+ }
+
+ .nut-tabs-titles-item-text {
+ color: $tabs-titles-item-active-color;
+ font-weight: $tabs-titles-item-active-font-weight;
+ }
.nut-tabs-titles-item-line {
overflow: unset;
@@ -113,28 +121,38 @@
overflow: unset;
width: 40px;
height: 20px;
+
+ .nut-icon {
+ color: $tabs-titles-item-active-color;
+ }
}
}
&-disabled {
color: $color-text-disabled;
+ .nut-icon {
+ color: $color-text-disabled;
+ }
+ .nut-tabs-titles-item-text {
+ color: $color-text-disabled;
+ }
}
}
&-simple {
- .nut-tabs-titles-item-active {
- color: $color-title;
- font-size: $tabs-titles-item-active-font-size;
+ .nut-tabs-titles-item {
+ &-active {
+ .nut-tabs-titles-item-text,
+ .nut-icon {
+ color: $color-title;
+ font-size: $tabs-titles-item-active-font-size;
+ }
+ }
}
}
&-card {
- padding: 0;
- background-color: $color-default-light;
-
.nut-tabs-titles-item {
- padding: 0;
-
&-active {
font-weight: $font-weight-bold;
background-color: $white;
@@ -158,22 +176,19 @@
.nut-tabs-titles-item-active {
.nut-tabs-titles-item-text {
background: $color-default-light;
- color: $color-text;
+ color: $tabs-titles-item-active-color;
border-radius: $tabs-tab-button-border-radius;
font-weight: $font-weight-bold;
background-color: $tabs-tab-button-active-background-color;
- color: $color-text-link;
border: $tabs-tab-button-active-border;
}
}
}
&-divider {
- padding: 0;
border-bottom: 1px solid $color-border;
.nut-tabs-titles-item {
- padding: 0;
position: relative;
&::after {
@@ -196,83 +211,35 @@
}
}
-[dir='rtl'] .nut-tabs-titles,
-.nut-rtl .nut-tabs-titles {
- &-item {
- &-smile,
- &-line {
- left: auto;
- right: 50%;
- transform: translate(50%, 0);
- }
- }
- &-divider {
- .nut-tabs-titles-item {
- &::after {
- right: auto;
- left: 0;
- }
- }
- }
-}
-
-.nut-tabs-horizontal {
- flex-direction: column;
- position: relative;
-}
-
.nut-tabs-vertical {
- flex-direction: row;
- width: 100%;
-
.nut-tabs-ellipsis {
- text-overflow: ellipsis;
- white-space: nowrap;
- overflow: hidden;
+ white-space: break-spaces;
+ padding-left: 6px;
+ width: 90px;
+ line-height: $font-size-base;
}
.nut-tabs-titles {
- box-sizing: border-box;
flex-direction: column;
height: 100%;
- padding: 0;
width: $tabs-vertical-titles-width;
flex-shrink: 0;
.nut-tabs-list {
- width: 100%;
- display: flex;
flex-direction: column;
- flex-shrink: 0;
- }
-
- &-line {
- .nut-tabs-titles-item {
- padding-left: 14px;
- }
}
}
- .nut-tabs-titles-scrollable {
- overflow-x: hidden;
- overflow-y: auto;
- }
-
.nut-tabs-titles-item {
height: $tabs-vertical-titles-item-height;
- margin: 0;
flex: none;
&-smile {
- width: 0;
- height: 0;
overflow: hidden;
transition: width 0.3s ease;
}
&-line {
- width: 0;
- height: 0;
transform: translate(0, -50%);
transition: height 0.3s ease;
@@ -294,8 +261,6 @@
right: -12px;
bottom: -2%;
left: auto;
- width: 40px;
- height: 20px;
transform: rotate(320deg);
}
}
@@ -304,15 +269,13 @@
.nut-tabs-horizontal {
.nut-tabs-titles {
flex-direction: row;
- overflow-x: auto;
- overflow-y: hidden;
height: $tabs-titles-height;
+ width: 100%;
+ padding: 0 !important;
.nut-tabs-list {
- width: 100%;
- display: flex;
flex-direction: row;
- flex-shrink: 0;
+ height: auto;
}
}
@@ -326,6 +289,9 @@
.nut-tabs-titles-item-line {
left: 50%;
transform: translate(-50%, 0);
+ width: $tabs-tab-line-width;
+ height: $tabs-tab-line-height;
+ background: $tabs-tab-line-color;
}
.nut-tabs-titles-item-smile {
@@ -349,32 +315,32 @@
height: 100%;
}
}
+}
- .nut-tabs-horizontal {
- .nut-tabs-titles {
- display: flex;
- flex-direction: row;
- padding: 0 !important;
- width: 100%;
-
- .nut-tabs-titles-item {
- display: flex;
- align-items: center;
- justify-content: center;
- flex: 1 0 auto;
+.nut-tabs-content {
+ display: flex;
+ box-sizing: border-box;
- &-active {
- color: $color-primary;
- font-weight: $tabs-titles-item-active-font-weight;
- font-size: $tabs-titles-item-active-font-size;
+ &-wrap {
+ overflow: hidden;
+ }
+}
- .nut-tabs-titles-item-line {
- content: ' ';
- width: $tabs-tab-line-width;
- height: $tabs-tab-line-height;
- background: $tabs-tab-line-color;
- }
- }
+[dir='rtl'] .nut-tabs-titles,
+.nut-rtl .nut-tabs-titles {
+ &-item {
+ &-smile,
+ &-line {
+ left: auto;
+ right: 50%;
+ transform: translate(50%, 0);
+ }
+ }
+ &-divider {
+ .nut-tabs-titles-item {
+ &::after {
+ right: auto;
+ left: 0;
}
}
}
@@ -422,12 +388,3 @@
}
}
}
-
-.nut-tabs-content {
- display: flex;
- box-sizing: border-box;
-
- &-wrap {
- overflow: hidden;
- }
-}
diff --git a/src/packages/tabs/tabs.taro.tsx b/src/packages/tabs/tabs.taro.tsx
index dc74a73294..e21dbff8de 100644
--- a/src/packages/tabs/tabs.taro.tsx
+++ b/src/packages/tabs/tabs.taro.tsx
@@ -67,27 +67,23 @@ export const Tabs: FunctionComponent> & {
value: outerValue,
defaultValue: outerDefaultValue,
...rest
- } = {
- ...defaultProps,
- ...props,
- }
+ } = { ...defaultProps, ...props }
+
const uuid = useUuid()
const [value, setValue] = usePropsValue({
value: outerValue,
defaultValue: outerDefaultValue,
- finalValue: 0,
onChange,
})
const titleItemsRef = useRef([])
- const navRef = useRef(null)
const getTitles = () => {
const titles: TabsTitle[] = []
- React.Children.forEach(children, (child: any, idx) => {
+ React.Children.forEach(children, (child, idx) => {
if (React.isValidElement(child)) {
- const props: any = child?.props
+ const { props } = child
if (props?.title || props?.value) {
titles.push({
title: props.title,
@@ -116,6 +112,7 @@ export const Tabs: FunctionComponent> & {
forceUpdate()
}
}, [children])
+
const classes = classNames(
classPrefix,
`${classPrefix}-${direction}`,
@@ -123,14 +120,9 @@ export const Tabs: FunctionComponent> & {
)
const classesTitle = classNames(`${classPrefix}-titles`, {
[`${classPrefix}-titles-${activeType}`]: activeType,
- [`${classPrefix}-titles-scrollable`]: true,
[`${classPrefix}-titles-${align}`]: align,
})
- const tabsActiveStyle = {
- color: activeType === 'smile' ? activeColor : '',
- background: activeType === 'line' ? activeColor : '',
- }
const getRect = (selector: string) => {
return new Promise((resolve) => {
createSelectorQuery()
@@ -162,8 +154,6 @@ export const Tabs: FunctionComponent> & {
width: number
}
const scrollWithAnimation = useRef(false)
- const navRectRef = useRef()
- const titleRectRef = useRef([])
const [scrollLeft, setScrollLeft] = useState(0)
const [scrollTop, setScrollTop] = useState(0)
const scrollDirection = (
@@ -174,16 +164,10 @@ export const Tabs: FunctionComponent> & {
const frames = 1
function animate() {
- if (direction === 'horizontal') {
- setScrollLeft(to)
- } else {
- setScrollTop(to)
- }
- if (++count < frames) {
- raf(animate)
- }
+ if (direction === 'horizontal') setScrollLeft(to)
+ else setScrollTop(to)
+ if (++count < frames) raf(animate)
}
-
animate()
}
const scrollIntoView = (index: number) => {
@@ -192,10 +176,7 @@ export const Tabs: FunctionComponent> & {
getRect(`#nut-tabs-titles-${name || uuid} .nut-tabs-list`),
getAllRect(`#nut-tabs-titles-${name || uuid} .nut-tabs-titles-item`),
]).then(([navRect, titleRects]: any) => {
- navRectRef.current = navRect
- titleRectRef.current = titleRects
- // @ts-ignore
- const titleRect: RectItem = titleRectRef.current[index]
+ const titleRect = titleRects[index]
if (!titleRect) return
let to = 0
@@ -203,17 +184,19 @@ export const Tabs: FunctionComponent> & {
const top = titleRects
.slice(0, index)
.reduce((prev: number, curr: RectItem) => prev + curr.height, 0)
- to = top - (navRectRef.current.height - titleRect.height) / 2
+ to = top - (navRect.height - titleRect.height) / 2
} else {
const left = titleRects
.slice(0, index)
.reduce((prev: number, curr: RectItem) => prev + curr.width, 0)
- to = rtl ? -left : left
+ to = left - (navRect.width - titleRect.width) / 2
+ // to < 0 说明不需要进行滚动,页面元素已全部显示出来
+ if (to < 0) return
+ to = rtl ? -to : to
}
nextTick(() => {
scrollWithAnimation.current = true
})
-
scrollDirection(to, direction)
})
})
@@ -228,7 +211,7 @@ export const Tabs: FunctionComponent> & {
transform:
direction === 'horizontal'
? `translate3d(${rtl ? '' : '-'}${index * 100}%, 0, 0)`
- : `translate3d( 0,-${index * 100}%, 0)`,
+ : `translate3d( 0, -${index * 100}%, 0)`,
transitionDuration: `${duration}ms`,
}
}
@@ -241,12 +224,11 @@ export const Tabs: FunctionComponent> & {
scrollIntoView(index)
}, [value])
- const tabChange = (item: TabsTitle, index: number) => {
+ const tabChange = (item: TabsTitle) => {
onClick && onClick(item.value)
- if (item.disabled) {
- return
+ if (!item.disabled) {
+ setValue(item.value)
}
- setValue(item.value)
}
return (
@@ -264,54 +246,49 @@ export const Tabs: FunctionComponent> & {
}
id={`nut-tabs-titles-${name || uuid}`}
className={classesTitle}
- style={{ ...tabStyle }}
+ style={tabStyle}
>
-
+
{!!title && typeof title === 'function'
? title()
: titles.current.map((item, index) => {
return (
titleItemsRef.current.push(ref)
}
id={`scrollIntoView${index}`}
- onClick={(e) => {
- tabChange(item, index)
- }}
+ onClick={() => tabChange(item)}
className={classNames(`${classPrefix}-titles-item`, {
[`nut-tabs-titles-item-active`]:
!item.disabled && String(item.value) === String(value),
[`nut-tabs-titles-item-disabled`]: item.disabled,
[`nut-tabs-titles-item-${align}`]: align,
})}
- key={item.value}
>
{activeType === 'line' && (
)}
{activeType === 'smile' && (
-
+
)}
{item.title}
@@ -323,25 +300,15 @@ export const Tabs: FunctionComponent> & {
{React.Children.map(children, (child, idx) => {
- if (!React.isValidElement(child)) {
- return null
- }
-
- let childProps = {
+ if (!React.isValidElement(child)) return null
+ return React.cloneElement(child, {
...child.props,
active: value === child.props.value,
- }
-
- if (
- String(value) !== String(child.props.value || idx) &&
- autoHeight
- ) {
- childProps = {
- ...childProps,
- autoHeightClassName: 'inactive',
- }
- }
- return React.cloneElement(child, childProps)
+ autoHeightClassName:
+ autoHeight && String(value) !== String(child.props.value || idx)
+ ? 'inactive'
+ : undefined,
+ })
})}
diff --git a/src/packages/tabs/tabs.tsx b/src/packages/tabs/tabs.tsx
index 103cbdb4a8..e61734a42f 100644
--- a/src/packages/tabs/tabs.tsx
+++ b/src/packages/tabs/tabs.tsx
@@ -42,6 +42,7 @@ const defaultProps = {
} as TabsProps
const classPrefix = 'nut-tabs'
+
export const Tabs: FunctionComponent> & {
TabPane: typeof TabPane
} = (props) => {
@@ -62,52 +63,43 @@ export const Tabs: FunctionComponent> & {
value: outerValue,
defaultValue: outerDefaultValue,
...rest
- } = {
- ...defaultProps,
- ...props,
- }
+ } = { ...defaultProps, ...props }
const [value, setValue] = usePropsValue({
value: outerValue,
defaultValue: outerDefaultValue,
- finalValue: 0,
onChange,
})
+
const titleItemsRef = useRef([])
const navRef = useRef(null)
+
const scrollDirection = (
- nav: any,
+ nav: HTMLDivElement,
to: number,
- duration: number,
- direction?: 'horizontal' | 'vertical'
+ duration: number
) => {
- let count = 0
const from = direction === 'horizontal' ? nav.scrollLeft : nav.scrollTop
const frames = duration === 0 ? 1 : Math.round((duration * 1000) / 16)
+ let count = 0
- function animate() {
- if (direction === 'horizontal') {
- nav.scrollLeft += (to - from) / frames
- } else {
- nav.scrollTop += (to - from) / frames
- }
-
- if (++count < frames) {
- raf(animate)
- }
+ const animate = () => {
+ if (direction === 'horizontal') nav.scrollLeft += (to - from) / frames
+ else nav.scrollTop += (to - from) / frames
+ if (++count < frames) raf(animate)
}
animate()
}
+
const scrollIntoView = (index: number, immediate?: boolean) => {
const nav = navRef.current
const titleItem = titleItemsRef.current
const titlesLength = titles.current.length
- const itemLength = titleItemsRef.current.length
+ const itemLength = titleItem.length
if (!nav || !titleItem || !titleItem[itemLength - titlesLength + index]) {
return
}
const title = titleItem[itemLength - titlesLength + index]
-
let to = 0
if (direction === 'vertical') {
const runTop = title.offsetTop - nav.offsetTop + 10
@@ -115,14 +107,14 @@ export const Tabs: FunctionComponent> & {
} else {
to = title.offsetLeft - (nav.offsetWidth - title.offsetWidth) / 2
}
- scrollDirection(nav, to, immediate ? 0 : 0.3, direction)
+ scrollDirection(nav, to, immediate ? 0 : 0.3)
}
const getTitles = () => {
const titles: TabsTitle[] = []
- React.Children.forEach(children, (child: any, idx) => {
+ React.Children.forEach(children, (child, idx) => {
if (React.isValidElement(child)) {
- const props: any = child?.props
+ const { props } = child
if (props?.title || props?.value) {
titles.push({
title: props.title,
@@ -140,7 +132,6 @@ export const Tabs: FunctionComponent> & {
titles.current = getTitles()
let current: string | number = ''
titles.current.forEach((title) => {
- // eslint-disable-next-line eqeqeq
if (title.value === value) {
current = value
}
@@ -159,29 +150,22 @@ export const Tabs: FunctionComponent> & {
)
const classesTitle = classNames(`${classPrefix}-titles`, {
[`${classPrefix}-titles-${activeType}`]: activeType,
- [`${classPrefix}-titles-scrollable`]: true,
[`${classPrefix}-titles-${align}`]: align,
})
- const tabsActiveStyle = {
- color: activeType === 'smile' ? activeColor : '',
- background: activeType === 'line' ? activeColor : '',
- }
const getContentStyle = () => {
- // eslint-disable-next-line eqeqeq
- let index = titles.current.findIndex((t) => t.value == value)
+ let index = titles.current.findIndex((t) => t.value === value)
index = index < 0 ? 0 : index
return {
transform:
direction === 'horizontal'
? `translate3d(${rtl ? '' : '-'}${index * 100}%, 0, 0)`
- : `translate3d( 0,-${index * 100}%, 0)`,
+ : `translate3d( 0, -${index * 100}%, 0)`,
transitionDuration: `${duration}ms`,
}
}
useEffect(() => {
- // eslint-disable-next-line eqeqeq
- let index = titles.current.findIndex((t) => t.value == value)
+ let index = titles.current.findIndex((t) => t.value === value)
index = index < 0 ? 0 : index
setTimeout(() => {
scrollIntoView(index)
@@ -190,52 +174,50 @@ export const Tabs: FunctionComponent> & {
const tabChange = (item: TabsTitle) => {
onClick && onClick(item.value)
- if (item.disabled) {
- return
+ if (!item.disabled) {
+ setValue(item.value)
}
- setValue(item.value)
}
return (
-
+
{!!title && typeof title === 'function'
? title()
: titles.current.map((item) => {
return (
{
- tabChange(item)
- }}
+ key={item.value}
+ ref={(ref: HTMLDivElement) => titleItemsRef.current.push(ref)}
+ onClick={() => tabChange(item)}
className={classNames(`${classPrefix}-titles-item`, {
[`nut-tabs-titles-item-active`]:
!item.disabled && String(item.value) === String(value),
[`nut-tabs-titles-item-disabled`]: item.disabled,
[`nut-tabs-titles-item-${align}`]: align,
})}
- ref={(ref: HTMLDivElement) => titleItemsRef.current.push(ref)}
- key={item.value}
>
{activeType === 'line' && (
)}
{activeType === 'smile' && (
-
+
)}
{item.title}
@@ -246,25 +228,15 @@ export const Tabs: FunctionComponent
> & {
{React.Children.map(children, (child, idx) => {
- if (!React.isValidElement(child)) {
- return null
- }
-
- let childProps = {
+ if (!React.isValidElement(child)) return null
+ return React.cloneElement(child, {
...child.props,
active: value === child.props.value,
- }
-
- if (
- String(value) !== String(child.props.value || idx) &&
- autoHeight
- ) {
- childProps = {
- ...childProps,
- autoHeightClassName: 'inactive',
- }
- }
- return React.cloneElement(child, childProps)
+ autoHeightClassName:
+ autoHeight && String(value) !== String(child.props.value || idx)
+ ? 'inactive'
+ : undefined,
+ })
})}