diff --git a/src/common/template/badge.wxml b/src/common/template/badge.wxml
new file mode 100644
index 000000000..ade19cbae
--- /dev/null
+++ b/src/common/template/badge.wxml
@@ -0,0 +1,16 @@
+
+
+
diff --git a/src/tabs/README.en-US.md b/src/tabs/README.en-US.md
index cb5f68b79..cae509968 100644
--- a/src/tabs/README.en-US.md
+++ b/src/tabs/README.en-US.md
@@ -12,8 +12,9 @@ show-bottom-line | Boolean | true | \- | N
sticky | Boolean | false | \- | N
sticky-props | Object | - | Typescript:`StickyProps`,[Sticky API Documents](./sticky?tab=api)。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N
swipeable | Boolean | true | \- | N
-value | String / Number | - | Typescript:`TabValue` `type TabValue = string | number`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N
-default-value | String / Number | undefined | uncontrolled property。Typescript:`TabValue` `type TabValue = string | number`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N
+theme | String | 'line' | options:line/tag/card | N
+value | String / Number | - | Typescript:`TabValue` `type TabValue = string \| number`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N
+default-value | String / Number | undefined | uncontrolled property。Typescript:`TabValue` `type TabValue = string \| number`。[see more ts definition](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N
### Tabs Events
@@ -21,12 +22,13 @@ name | params | description
-- | -- | --
change | `(value: TabValue, label: string)` | \-
click | `(value: TabValue, label: string)` | \-
-scroll | `({ scrollTop: number, isFixed: boolean })` | \-
+scroll | `(scrollTop: number, isFixed: boolean)` | \-
### TabPanel Props
name | type | default | description | required
-- | -- | -- | -- | --
+badge-props | Object | {} | \- | N
destroy-on-hide | Boolean | true | \- | N
disabled | Boolean | false | \- | N
label | String | - | \- | N
diff --git a/src/tabs/README.md b/src/tabs/README.md
index 1e97cfda7..2faf95f55 100644
--- a/src/tabs/README.md
+++ b/src/tabs/README.md
@@ -27,6 +27,8 @@ CSS 变量名|说明
--td-tab-item-disabled-color | 选项卡禁止状态时字体颜色
--td-tab-track-color | 选项卡滑块颜色
--td-tab-track-thickness | 选项卡滑块厚度(水平时为高度,垂直时为宽度)
+--td-tab-track-width | 选项卡滑块宽度
+--td-tab-track-radius | 选项卡滑块圆角
--td-tab-border-color | 选项卡底部边框颜色
## 代码演示
@@ -119,21 +121,23 @@ show-bottom-line | Boolean | true | 是否展示底部激活线条 | N
sticky | Boolean | false | 是否开启粘性布局 | N
sticky-props | Object | - | 透传至 Sticky 组件。TS 类型:`StickyProps`,[Sticky API Documents](./sticky?tab=api)。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N
swipeable | Boolean | true | 是否可以滑动切换 | N
-value | String / Number | - | 激活的选项卡值。TS 类型:`TabValue` `type TabValue = string | number`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N
-default-value | String / Number | undefined | 激活的选项卡值。非受控属性。TS 类型:`TabValue` `type TabValue = string | number`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N
+theme | String | 'line' | 标签的样式。可选项:line/tag/card | N
+value | String / Number | - | 激活的选项卡值。TS 类型:`TabValue` `type TabValue = string \| number`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N
+default-value | String / Number | undefined | 激活的选项卡值。非受控属性。TS 类型:`TabValue` `type TabValue = string \| number`。[详细类型定义](https://github.com/Tencent/tdesign-miniprogram/tree/develop/src/tabs/type.ts) | N
### Tabs Events
名称 | 参数 | 描述
-- | -- | --
change | `(value: TabValue, label: string)` | 激活的选项卡发生变化时触发
-click | `(value: TabValue, label: string)` | 点击 tab 选项卡时触发
-scroll | `({ scrollTop: number, isFixed: boolean })` | 页面滚动时触发,scrollTop: 距离顶部位置,isFixed: 是否吸顶
+click | `(value: TabValue, label: string)` | 点击选项卡时触发
+scroll | `(scrollTop: number, isFixed: boolean)` | 页面滚动时触发
### TabPanel Props
名称 | 类型 | 默认值 | 说明 | 必传
-- | -- | -- | -- | --
+badge-props | Object | null | 透传至 Badge 组件 | N
destroy-on-hide | Boolean | true | 选项卡内容隐藏时是否销毁 | N
disabled | Boolean | false | 是否禁用当前选项卡 | N
label | String | - | 选项卡名称 | N
diff --git a/src/tabs/__test__/__snapshots__/demo.test.js.snap b/src/tabs/__test__/__snapshots__/demo.test.js.snap
index 07af7cef9..8ce859ee1 100644
--- a/src/tabs/__test__/__snapshots__/demo.test.js.snap
+++ b/src/tabs/__test__/__snapshots__/demo.test.js.snap
@@ -1,42 +1,5 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`Tabs Tabs adjust-time demo works fine 1`] = `
-
-
-
- 标签一内容
-
-
- 标签二内容
-
-
- 标签三内容
-
-
- 标签四内容
-
-
-
-`;
-
exports[`Tabs Tabs base demo works fine 1`] = `
- 标签一内容
-
+ />
- 标签二内容
-
+ />
- 标签一内容
-
+ />
- 标签二内容
-
+ />
- 标签三内容
-
+ />
- 标签一内容
-
+ />
- 标签二内容
-
+ />
- 标签三内容
-
+ />
- 标签四内容
-
+ />
`;
@@ -128,46 +73,41 @@ exports[`Tabs Tabs scroll demo works fine 1`] = `
- 标签一内容
-
+ label="选项"
+ value="{{0}}"
+ />
- 标签二内容
-
+ label="选项"
+ value="{{1}}"
+ />
- 标签三内容
-
+ label="选项"
+ value="{{2}}"
+ />
- 标签四内容
-
+ label="选项"
+ value="{{3}}"
+ />
- 标签五内容
-
+ label="选项"
+ value="{{4}}"
+ />
- 标签六内容
-
+ label="选项"
+ value="{{5}}"
+ />
+
+
`;
@@ -176,66 +116,47 @@ exports[`Tabs Tabs size demo works fine 1`] = `
- 标签一内容
-
+ />
- 标签二内容
-
+ />
- 标签三内容
-
+ />
- 标签四内容
-
+ />
+
- 标签一内容
-
+ />
- 标签二内容
-
+ />
- 标签三内容
-
+ />
- 标签四内容
-
+ />
`;
@@ -244,68 +165,74 @@ exports[`Tabs Tabs status demo works fine 1`] = `
- 标签一内容
-
+ />
- 标签二内容
-
+ />
- 禁用状态
-
+ />
`;
-exports[`Tabs Tabs unline demo works fine 1`] = `
-
+exports[`Tabs Tabs theme demo works fine 1`] = `
+
- 标签一内容
-
+ />
- 标签二内容
-
+ />
- 标签三内容
-
+ />
- 标签四内容
-
+ />
-
+
+
+
+
+
+
+
+
`;
exports[`Tabs Tabs vertical demo works fine 1`] = `
@@ -370,3 +297,71 @@ exports[`Tabs Tabs vertical demo works fine 1`] = `
`;
+
+exports[`Tabs Tabs with-badge demo works fine 1`] = `
+
+
+
+
+
+
+
+`;
+
+exports[`Tabs Tabs with-content demo works fine 1`] = `
+
+
+
+ 标签一内容
+
+
+ 标签二内容
+
+
+ 标签三内容
+
+
+ 标签四内容
+
+
+
+`;
diff --git a/src/tabs/__test__/__snapshots__/index.test.js.snap b/src/tabs/__test__/__snapshots__/index.test.js.snap
index a7afc7dff..fda6693f5 100644
--- a/src/tabs/__test__/__snapshots__/index.test.js.snap
+++ b/src/tabs/__test__/__snapshots__/index.test.js.snap
@@ -20,7 +20,7 @@ exports[`tabs :base 1`] = `
style="z-index:2;position:fixed;top:0px"
>
-
- 标签页一
-
+
+ 标签页一
+
-
- label1
-
+
+ label1
+
-
- label2
-
+
+ label2
+
-
- label3
-
+
+ label3
+
diff --git a/src/tabs/__test__/demo.test.js b/src/tabs/__test__/demo.test.js
index 6b5e564fc..bdb431199 100644
--- a/src/tabs/__test__/demo.test.js
+++ b/src/tabs/__test__/demo.test.js
@@ -5,7 +5,7 @@
import simulate from 'miniprogram-simulate';
import path from 'path';
-const mapper = ['adjust-time', 'base', 'scroll', 'size', 'status', 'unline', 'vertical'];
+const mapper = ['base', 'scroll', 'size', 'status', 'theme', 'vertical', 'with-badge', 'with-content'];
describe('Tabs', () => {
mapper.forEach((demoName) => {
diff --git a/src/tabs/_example/base/index.wxml b/src/tabs/_example/base/index.wxml
index 51cf68f7f..9c3d39f75 100644
--- a/src/tabs/_example/base/index.wxml
+++ b/src/tabs/_example/base/index.wxml
@@ -1,12 +1,12 @@
- 标签一内容
- 标签二内容
+
+
- 标签一内容
- 标签二内容
- 标签三内容
+
+
+
- 标签一内容
- 标签二内容
- 标签三内容
- 标签四内容
+
+
+
+
diff --git a/src/tabs/_example/base/index.wxss b/src/tabs/_example/base/index.wxss
index 77126f4a9..3980d90af 100644
--- a/src/tabs/_example/base/index.wxss
+++ b/src/tabs/_example/base/index.wxss
@@ -5,7 +5,7 @@
.custom-tabs t-tab-panel {
text-align: center;
justify-content: center;
- height: 172rpx;
+ max-height: 172rpx;
line-height: 172rpx;
color: rgba(0, 0, 0, 0.26);
}
diff --git a/src/tabs/_example/scroll/index.wxml b/src/tabs/_example/scroll/index.wxml
index dc1f851ce..4b422fc6e 100644
--- a/src/tabs/_example/scroll/index.wxml
+++ b/src/tabs/_example/scroll/index.wxml
@@ -1,8 +1,3 @@
-
- 标签一内容
- 标签二内容
- 标签三内容
- 标签四内容
- 标签五内容
- 标签六内容
+
+
diff --git a/src/tabs/_example/scroll/index.wxss b/src/tabs/_example/scroll/index.wxss
index 1f9132a24..e69de29bb 100644
--- a/src/tabs/_example/scroll/index.wxss
+++ b/src/tabs/_example/scroll/index.wxss
@@ -1,7 +0,0 @@
-.custom-tabs t-tab-panel {
- text-align: center;
- justify-content: center;
- height: 172rpx;
- line-height: 172rpx;
- color: rgba(0, 0, 0, 0.26);
-}
diff --git a/src/tabs/_example/size/index.wxml b/src/tabs/_example/size/index.wxml
index e592a9847..8b5cfb04d 100644
--- a/src/tabs/_example/size/index.wxml
+++ b/src/tabs/_example/size/index.wxml
@@ -1,19 +1,15 @@
-
- 标签一内容
- 标签二内容
- 标签三内容
- 标签四内容
+
+
+
+
+
-
- 标签一内容
- 标签二内容
- 标签三内容
- 标签四内容
+
+
+
+
+
+
+
diff --git a/src/tabs/_example/status/index.wxml b/src/tabs/_example/status/index.wxml
index 6a2a820d7..cd2f43e4b 100644
--- a/src/tabs/_example/status/index.wxml
+++ b/src/tabs/_example/status/index.wxml
@@ -1,5 +1,5 @@
-
- 标签一内容
- 标签二内容
- 禁用状态
+
+
+
+
diff --git a/src/tabs/_example/status/index.wxss b/src/tabs/_example/status/index.wxss
index 1f9132a24..e69de29bb 100644
--- a/src/tabs/_example/status/index.wxss
+++ b/src/tabs/_example/status/index.wxss
@@ -1,7 +0,0 @@
-.custom-tabs t-tab-panel {
- text-align: center;
- justify-content: center;
- height: 172rpx;
- line-height: 172rpx;
- color: rgba(0, 0, 0, 0.26);
-}
diff --git a/src/tabs/_example/tabs.json b/src/tabs/_example/tabs.json
index 2fff7d242..b05d617f9 100644
--- a/src/tabs/_example/tabs.json
+++ b/src/tabs/_example/tabs.json
@@ -6,8 +6,8 @@
"scroll": "./scroll",
"size": "./size",
"status": "./status",
- "unline": "./unline",
- "vertical": "./vertical",
- "adjust-time": "./adjust-time"
+ "with-badge": "./with-badge",
+ "theme": "./theme",
+ "with-content": "./with-content"
}
}
diff --git a/src/tabs/_example/tabs.wxml b/src/tabs/_example/tabs.wxml
index e301ad9a3..5e8b60cab 100644
--- a/src/tabs/_example/tabs.wxml
+++ b/src/tabs/_example/tabs.wxml
@@ -1,26 +1,25 @@
Tabs 选项卡
用于内容分类后的展示切换。
-
+
-
-
-
+
+
-
-
+
+
-
+
-
-
-
-
+
+
+
+
diff --git a/src/tabs/_example/theme/index.js b/src/tabs/_example/theme/index.js
new file mode 100644
index 000000000..b79c5124b
--- /dev/null
+++ b/src/tabs/_example/theme/index.js
@@ -0,0 +1 @@
+Component({});
diff --git a/src/tabs/_example/theme/index.json b/src/tabs/_example/theme/index.json
new file mode 100644
index 000000000..467ce2945
--- /dev/null
+++ b/src/tabs/_example/theme/index.json
@@ -0,0 +1,3 @@
+{
+ "component": true
+}
diff --git a/src/tabs/_example/theme/index.wxml b/src/tabs/_example/theme/index.wxml
new file mode 100644
index 000000000..94277d0c4
--- /dev/null
+++ b/src/tabs/_example/theme/index.wxml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/tabs/_example/theme/index.wxss b/src/tabs/_example/theme/index.wxss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/tabs/_example/unline/index.wxml b/src/tabs/_example/unline/index.wxml
deleted file mode 100644
index 44d3e3cd8..000000000
--- a/src/tabs/_example/unline/index.wxml
+++ /dev/null
@@ -1,12 +0,0 @@
-
- 标签一内容
- 标签二内容
- 标签三内容
- 标签四内容
-
diff --git a/src/tabs/_example/unline/index.wxss b/src/tabs/_example/unline/index.wxss
deleted file mode 100644
index 1f9132a24..000000000
--- a/src/tabs/_example/unline/index.wxss
+++ /dev/null
@@ -1,7 +0,0 @@
-.custom-tabs t-tab-panel {
- text-align: center;
- justify-content: center;
- height: 172rpx;
- line-height: 172rpx;
- color: rgba(0, 0, 0, 0.26);
-}
diff --git a/src/tabs/_example/adjust-time/index.js b/src/tabs/_example/with-badge/index.js
similarity index 100%
rename from src/tabs/_example/adjust-time/index.js
rename to src/tabs/_example/with-badge/index.js
diff --git a/src/tabs/_example/adjust-time/index.json b/src/tabs/_example/with-badge/index.json
similarity index 100%
rename from src/tabs/_example/adjust-time/index.json
rename to src/tabs/_example/with-badge/index.json
diff --git a/src/tabs/_example/with-badge/index.wxml b/src/tabs/_example/with-badge/index.wxml
new file mode 100644
index 000000000..d6e2e7662
--- /dev/null
+++ b/src/tabs/_example/with-badge/index.wxml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/tabs/_example/with-badge/index.wxss b/src/tabs/_example/with-badge/index.wxss
new file mode 100644
index 000000000..e69de29bb
diff --git a/src/tabs/_example/unline/index.js b/src/tabs/_example/with-content/index.js
similarity index 100%
rename from src/tabs/_example/unline/index.js
rename to src/tabs/_example/with-content/index.js
diff --git a/src/tabs/_example/unline/index.json b/src/tabs/_example/with-content/index.json
similarity index 100%
rename from src/tabs/_example/unline/index.json
rename to src/tabs/_example/with-content/index.json
diff --git a/src/tabs/_example/adjust-time/index.wxml b/src/tabs/_example/with-content/index.wxml
similarity index 100%
rename from src/tabs/_example/adjust-time/index.wxml
rename to src/tabs/_example/with-content/index.wxml
diff --git a/src/tabs/_example/adjust-time/index.wxss b/src/tabs/_example/with-content/index.wxss
similarity index 100%
rename from src/tabs/_example/adjust-time/index.wxss
rename to src/tabs/_example/with-content/index.wxss
diff --git a/src/tabs/props.ts b/src/tabs/props.ts
index 731584fc4..fad98d3f9 100644
--- a/src/tabs/props.ts
+++ b/src/tabs/props.ts
@@ -38,6 +38,11 @@ const props: TdTabsProps = {
type: Boolean,
value: true,
},
+ /** 标签的样式 */
+ theme: {
+ type: String,
+ value: 'line',
+ },
/** 激活的选项卡值 */
value: {
type: null,
diff --git a/src/tabs/tab-panel-props.ts b/src/tabs/tab-panel-props.ts
index b95b97160..9de5b07df 100644
--- a/src/tabs/tab-panel-props.ts
+++ b/src/tabs/tab-panel-props.ts
@@ -6,6 +6,11 @@
import { TdTabPanelProps } from './type';
const props: TdTabPanelProps = {
+ /** 透传至 Badge 组件 */
+ badgeProps: {
+ type: Object,
+ value: null,
+ },
/** 选项卡内容隐藏时是否销毁 */
destroyOnHide: {
type: Boolean,
diff --git a/src/tabs/tabs.json b/src/tabs/tabs.json
index 901f286cb..22785caf6 100644
--- a/src/tabs/tabs.json
+++ b/src/tabs/tabs.json
@@ -1,6 +1,7 @@
{
"component": true,
"usingComponents": {
- "t-sticky": "../sticky/sticky"
+ "t-sticky": "../sticky/sticky",
+ "t-badge": "../badge/badge"
}
}
diff --git a/src/tabs/tabs.less b/src/tabs/tabs.less
index fa845ce5b..4396ef9e2 100644
--- a/src/tabs/tabs.less
+++ b/src/tabs/tabs.less
@@ -2,7 +2,7 @@
@tab-nav-background-color: #fff;
-@tab-item-height--horizontal: 92rpx;
+@tab-item-height--horizontal: 96rpx;
@tab-item-height--vertical: 108rpx;
@tab-item-width--vertical: 208rpx;
@@ -13,7 +13,13 @@
// track
@tab-track-color: @primary-color;
-@tab-track-thickness: 4rpx;
+@tab-track-thickness: 6rpx;
+@tab-track-width: 32rpx;
+@tab-track-radius: 8rpx;
+
+// theme = tag
+@tab-item-height--tag: 64rpx;
+@tab-item-background--tag: @primary-color-1;
page {
--td-tab-nav-bg-color: @tab-nav-background-color;
@@ -21,23 +27,29 @@ page {
--td-tab-item-active-color: @tab-item-active-color;
--td-tab-item-disabled-color: @tab-item-disabled-color;
--td-tab-track-color: @tab-track-color;
+ --td-tab-track-width: @tab-track-width;
--td-tab-track-thickness: @tab-track-thickness;
+ --td-tab-track-radius: @tab-track-radius;
--td-tab-border-color: @tab-border-color;
}
.@{prefix}-tabs {
position: relative;
+ font-size: 28rpx;
+ background: var(--td-tab-nav-bg-color, @tab-nav-background-color);
&__wrapper {
display: flex;
overflow: hidden;
- }
+ background: var(--td-tab-nav-bg-color, @tab-nav-background-color);
- font-size: 28rpx;
- background-color: #fff;
+ &--card {
+ background: @gray-color-1;
+ }
+ }
.@{prefix}-is-active {
- font-weight: 700;
+ font-weight: 600;
color: var(--td-tab-item-active-color, @tab-item-active-color);
}
@@ -46,21 +58,24 @@ page {
}
&__item {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
flex: 1;
font-weight: 400;
color: var(--td-tab-item-color, @tab-item-color);
+ padding: 16rpx;
+ box-sizing: border-box;
&--top,
&--bottom {
height: @tab-item-height--horizontal;
- line-height: @tab-item-height--horizontal;
- text-align: center;
- min-width: 162rpx;
+ min-width: 112rpx;
}
&--left,
&--right {
- text-align: center;
height: @tab-item-height--vertical;
line-height: @tab-item-height--vertical;
width: @tab-item-width--vertical;
@@ -70,6 +85,41 @@ page {
background-color: #fff;
}
}
+
+ &-inner {
+ &--tag {
+ width: 100%;
+ text-align: center;
+ line-height: @tab-item-height--tag;
+ border-radius: (@tab-item-height--tag / 2);
+ background-color: @tab-item-background--tag;
+ }
+ }
+
+ &--card {
+ &.@{prefix}-is-active {
+ background-color: @bg-color-block;
+ border-radius: 0 18rpx 0 0;
+ }
+ }
+
+ &-tail {
+ position: absolute;
+ bottom: 0;
+ right: -36rpx;
+ width: 36rpx;
+ height: 36rpx;
+ background: #fff;
+
+ &::after {
+ content: '';
+ display: block;
+ width: 100%;
+ height: 100%;
+ background-color: @gray-color-1;
+ border-radius: 0 0 0 18rpx;
+ }
+ }
}
&__content {
@@ -108,6 +158,15 @@ page {
top: 0;
width: var(--td-tab-track-thickness, @tab-track-thickness);
}
+
+ &--top,
+ &--bottom {
+ left: 0;
+ bottom: 0;
+ width: var(--td-tab-track-width, @tab-track-width);
+ height: var(--td-tab-track-thickness, @tab-track-thickness);
+ border-radius: var(--td-tab-track-radius, @tab-track-radius);
+ }
}
&__scroll {
@@ -115,15 +174,26 @@ page {
&--bottom {
height: @tab-item-height--horizontal;
position: relative;
- background-color: var(--td-tab-nav-bg-color, @tab-nav-background-color);
&::after {
content: '';
}
}
+
&--top {
- border-bottom: solid 1rpx var(--td-tab-border-color, @tab-border-color);
+ &:after {
+ content: '';
+ display: block;
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ height: 1px;
+ background-color: var(--td-tab-border-color, @tab-border-color);
+ transform: scaleY(0.5);
+ }
}
+
&--left,
&--right {
width: @tab-item-width--vertical;
@@ -147,12 +217,6 @@ page {
transition-property: transform;
}
- .@{prefix}-tabs__track {
- left: 0;
- bottom: 0;
- height: var(--td-tab-track-thickness, @tab-track-thickness);
- }
-
.@{prefix}-tabs__content {
width: 100%;
}
diff --git a/src/tabs/tabs.ts b/src/tabs/tabs.ts
index 001661f8b..f91f004fc 100644
--- a/src/tabs/tabs.ts
+++ b/src/tabs/tabs.ts
@@ -13,7 +13,6 @@ enum Position {
bottom = 'bottom',
left = 'left',
}
-const trackLineWidth = 30;
@wxComponent()
export default class Tabs extends SuperComponent {
behaviors = [dom, touch];
@@ -83,8 +82,8 @@ export default class Tabs extends SuperComponent {
});
this.adjustPlacement();
- this.gettingBoundingClientRect(`.${name}`, true).then((res: any) => {
- this.containerWidth = res[0].width;
+ this.gettingBoundingClientRect(`.${name}`).then((res: any) => {
+ this.containerWidth = res.width;
});
}
@@ -109,12 +108,9 @@ export default class Tabs extends SuperComponent {
updateTabs(cb) {
const { children } = this;
- this.setData(
- {
- tabs: children.map((child: any) => child.data),
- },
- cb,
- );
+ const tabs = children.map((child: any) => child.data);
+
+ this.setData({ tabs }, cb);
this.setCurrentIndexByName(this.properties.value);
}
@@ -160,53 +156,71 @@ export default class Tabs extends SuperComponent {
return currentIndex * targetWidth - (1 / 2) * containerWidth + targetWidth / 2;
}
- setTrack() {
+ getTrackSize() {
+ return new Promise((resolve) => {
+ if (this.trackWidth) {
+ resolve(this.trackWidth);
+ return;
+ }
+ this.gettingBoundingClientRect(`.${prefix}-tabs__track`).then((res) => {
+ if (res) {
+ this.trackWidth = res.width;
+ resolve(this.trackWidth);
+ }
+ });
+ });
+ }
+
+ async setTrack() {
if (!this.properties.showBottomLine) return;
const { children } = this;
if (!children) return;
const { currentIndex, isScrollX, direction } = this.data;
if (currentIndex <= -1) return;
- this.gettingBoundingClientRect(`.${prefix}-tabs__item`, true)
- .then((res: any) => {
- const rect = res[currentIndex];
- if (!rect) return;
- let count = 0;
- let distance = 0;
- // eslint-disable-next-line no-restricted-syntax
- for (const item of res) {
- if (count < currentIndex) {
- distance += isScrollX ? item.width : item.height;
- count += 1;
- }
- }
- if (this.containerWidth) {
- const offset = this.calcScrollOffset(
- this.containerWidth,
- rect.left,
- rect.width,
- this.data.offset,
- currentIndex,
- );
- this.setData({
- offset,
- });
+ try {
+ const res = await this.gettingBoundingClientRect(`.${prefix}-tabs__item`, true);
+ const rect = res[currentIndex];
+ if (!rect) return;
+ let count = 0;
+ let distance = 0;
+ // eslint-disable-next-line no-restricted-syntax
+ for (const item of res) {
+ if (count < currentIndex) {
+ distance += isScrollX ? item.width : item.height;
+ count += 1;
}
+ }
- if (isScrollX) {
- distance += (rect.width - trackLineWidth) / 2;
- }
- let trackStyle = `-webkit-transform: translate${direction}(${distance}px);
- transform: translate${direction}(${distance}px);
- `;
- trackStyle += isScrollX ? `width: ${trackLineWidth}px;` : `height: ${rect.height}px;`;
+ if (this.containerWidth) {
+ const offset = this.calcScrollOffset(
+ this.containerWidth,
+ rect.left,
+ rect.width,
+ this.data.offset,
+ currentIndex,
+ );
this.setData({
- trackStyle,
+ offset,
});
- })
- .catch((err) => {
- this.triggerEvent('error', err);
+ }
+
+ if (isScrollX) {
+ const trackLineWidth = await this.getTrackSize();
+ distance += (rect.width - trackLineWidth) / 2;
+ }
+ let trackStyle = `-webkit-transform: translate${direction}(${distance}px);
+ transform: translate${direction}(${distance}px);
+ `;
+ if (!isScrollX) {
+ trackStyle += `height: ${rect.height}px;`;
+ }
+ this.setData({
+ trackStyle,
});
+ } catch (err) {
+ this.triggerEvent('error', err);
+ }
}
onTabTap(event: any) {
diff --git a/src/tabs/tabs.wxml b/src/tabs/tabs.wxml
index 34e6a5460..87eb2e93f 100644
--- a/src/tabs/tabs.wxml
+++ b/src/tabs/tabs.wxml
@@ -1,3 +1,4 @@
+
@@ -9,7 +10,7 @@
container="{{ stickyProps.container }}"
bind:scroll="onTouchScroll"
>
-
+
- {{item.label}}
+
+
+
+
+ {{item.label}}
+
+
diff --git a/src/tabs/type.ts b/src/tabs/type.ts
index 0e6f0c845..cd161a50b 100644
--- a/src/tabs/type.ts
+++ b/src/tabs/type.ts
@@ -60,6 +60,14 @@ export interface TdTabsProps {
type: BooleanConstructor;
value?: boolean;
};
+ /**
+ * 标签的样式
+ * @default 'line'
+ */
+ theme?: {
+ type: StringConstructor;
+ value?: 'line' | 'tag' | 'card';
+ };
/**
* 激活的选项卡值
*/
@@ -77,6 +85,14 @@ export interface TdTabsProps {
}
export interface TdTabPanelProps {
+ /**
+ * 透传至 Badge 组件
+ * @default {}
+ */
+ badgeProps?: {
+ type: ObjectConstructor;
+ value?: object;
+ };
/**
* 选项卡内容隐藏时是否销毁
* @default true