Skip to content

Commit 3c203b0

Browse files
RSS1102tdesign-botuyarngithub-actions[bot]
authored
feat(Tabs): extract the remove event and add TabPanel onRemove event (#5853)
* refactor(tabs): extract the remove event to outside the icon * refactor(tabs): inline removeBtn function for cleaner code * chore: stash changelog [ci skip] * chore: update CHANGELOG * fix(tabs): correct class assignment for remove button icon * feat(tabs): 添加 panel `onRemove` 方法触发,添加相关测试 * chore: update common * fix(tabs): 修正 onTabPanelRemoveFn 的命名一致性 * chore: stash changelog [ci skip] --------- Co-authored-by: tdesign-bot <[email protected]> Co-authored-by: wū yāng <[email protected]> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
1 parent 862e845 commit 3c203b0

File tree

5 files changed

+36
-12
lines changed

5 files changed

+36
-12
lines changed

packages/components/tabs/__tests__/tabs.test.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,16 @@ describe('Tabs', () => {
111111
});
112112

113113
it('@remove', async () => {
114-
const fn = vi.fn();
114+
const onTabRemoveFn = vi.fn();
115+
const onTabPanelRemoveFn = vi.fn();
115116
const wrapper = mount({
116117
render() {
117118
return (
118-
<Tabs theme={'card'} onRemove={fn} value={2}>
119-
<TabPanel value={1} label={'1'} removable={true}>
119+
<Tabs theme={'card'} onRemove={onTabRemoveFn} value={2}>
120+
<TabPanel value={1} label={'1'} removable={true} onRemove={onTabPanelRemoveFn}>
120121
1
121122
</TabPanel>
122-
<TabPanel value={2} label={'2'} removable={true}>
123+
<TabPanel value={2} label={'2'} removable={true} onRemove={onTabPanelRemoveFn}>
123124
2
124125
</TabPanel>
125126
</Tabs>
@@ -129,7 +130,12 @@ describe('Tabs', () => {
129130
await nextTick();
130131
const tabs = wrapper.findComponent(Tabs);
131132
tabs.vm.$el.getElementsByClassName('remove-btn')[0].dispatchEvent(new Event('click'));
132-
expect(tabs.props('onRemove')).toBeTruthy();
133+
134+
expect(onTabRemoveFn).toHaveBeenCalledTimes(1);
135+
expect(onTabPanelRemoveFn).toHaveBeenCalledTimes(1);
136+
137+
expect(onTabRemoveFn).toHaveBeenCalledWith({ value: 1, e: expect.any(Event), index: 0 });
138+
expect(onTabPanelRemoveFn).toHaveBeenCalledWith({ value: 1, e: expect.any(Event) });
133139
});
134140
});
135141
});

packages/components/tabs/tab-nav-item.tsx

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { computed, defineComponent, ref, PropType } from 'vue';
22
import { CloseIcon as TdCloseIcon } from 'tdesign-icons-vue-next';
33
import tabProps from './props';
44
import tabPanelProps from './tab-panel-props';
5+
import { TdTabsProps, TdTabPanelProps } from './type';
56

67
// hooks
78
import { useRipple, useGlobalIcon, usePrefixClass, useCommonClassName } from '@tdesign/shared-hooks';
@@ -23,7 +24,8 @@ export default defineComponent({
2324
removable: tabPanelProps.removable,
2425
value: tabPanelProps.value,
2526
onClick: Function as PropType<Function>,
26-
onRemove: Function as PropType<Function>,
27+
onTabRemove: Function as PropType<TdTabsProps['onRemove']>,
28+
onTabPanelRemove: Function as PropType<TdTabPanelProps['onRemove']>,
2729
},
2830

2931
setup(props) {
@@ -37,7 +39,8 @@ export default defineComponent({
3739

3840
const removeBtnClick = ({ e }: { e: MouseEvent }) => {
3941
if (e) e.stopPropagation();
40-
props.onRemove({ e, value: props.value, index: props.index });
42+
props.onTabRemove({ e, value: props.value, index: props.index });
43+
props.onTabPanelRemove({ e, value: props.value });
4144
};
4245
const onClickNav = (e: MouseEvent) => {
4346
if (props.disabled) return;
@@ -57,11 +60,18 @@ export default defineComponent({
5760
};
5861
});
5962

63+
const removeBtn = () =>
64+
props.removable && !props.disabled ? (
65+
<span onClick={(e) => removeBtnClick({ e })} class="remove-btn">
66+
<CloseIcon />
67+
</span>
68+
) : null;
69+
6070
const renderCardItem = () => {
6171
return (
6272
<div class={navItemClass.value} onClick={onClickNav} ref={itemRef}>
6373
<span class={`${COMPONENT_NAME.value}-text-wrapper`}>{props.label}</span>
64-
{props.removable && !props.disabled ? <CloseIcon class="remove-btn" onClick={removeBtnClick} /> : null}
74+
{removeBtn()}
6575
</div>
6676
);
6777
};
@@ -80,7 +90,7 @@ export default defineComponent({
8090
>
8191
<span class={`${COMPONENT_NAME.value}-text-wrapper`}>{props.label}</span>
8292
</div>
83-
{props.removable && !props.disabled ? <CloseIcon class="remove-btn" onClick={removeBtnClick} /> : null}
93+
{removeBtn()}
8494
</div>
8595
);
8696
};

packages/components/tabs/tab-nav.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ export default defineComponent({
191191
}
192192
props.onChange(value);
193193
};
194-
const removeBtnClick = ({ e, value, index }: Parameters<TdTabsProps['onRemove']>[0]) => {
194+
const onTabRemove = ({ e, value, index }: Parameters<TdTabsProps['onRemove']>[0]) => {
195195
props.onRemove({ e, value, index });
196196
};
197197
const setActiveTab = (ref: any) => {
@@ -239,7 +239,8 @@ export default defineComponent({
239239
removable={panel.removable}
240240
value={panel.value}
241241
onClick={(e: MouseEvent) => tabClick(e, panel)}
242-
onRemove={removeBtnClick}
242+
onTabRemove={onTabRemove}
243+
onTabPanelRemove={panel.onRemove}
243244
/>
244245
);
245246
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
pr_number: 5853
3+
contributor: RSS1102
4+
---
5+
6+
- feat(Tabs): 将 remove 事件从删除图标移至外层容器, 保证替换图标功能正常使用,有覆盖删除图标样式请注意此变更 ⚠️ @RSS1102 ([#5853](https://github.com/Tencent/tdesign-vue-next/pull/5853))
7+
- feat(TabPanel): 新增 `remove` 事件,方便独立Panel 处理移除后的相关逻辑 @RSS1102 ([#5853](https://github.com/Tencent/tdesign-vue-next/pull/5853))

0 commit comments

Comments
 (0)