Skip to content

Commit 4840f85

Browse files
authored
fix: onChange should not trigger when click current tab (#450)
1 parent 483cbdf commit 4840f85

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

src/Tabs.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,11 @@ function Tabs(
183183
// ======================== Events ========================
184184
function onInternalTabClick(key: string, e: React.MouseEvent | React.KeyboardEvent) {
185185
onTabClick?.(key, e);
186-
186+
const isActiveChanged = key !== mergedActiveKey;
187187
setMergedActiveKey(key);
188-
onChange?.(key);
188+
if (isActiveChanged) {
189+
onChange?.(key);
190+
}
189191
}
190192

191193
// ======================== Render ========================

tests/index.test.tsx

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ describe('Tabs.Basic', () => {
5555
const list: { name: string; trigger: (wrapper: ReactWrapper) => void }[] = [
5656
{
5757
name: 'outer div',
58-
trigger: (wrapper) => wrapper.find('.rc-tabs-tab').at(2).simulate('click'),
58+
trigger: wrapper => wrapper.find('.rc-tabs-tab').at(2).simulate('click'),
5959
},
6060
{
6161
name: 'inner button',
62-
trigger: (wrapper) => wrapper.find('.rc-tabs-tab .rc-tabs-tab-btn').at(2).simulate('click'),
62+
trigger: wrapper => wrapper.find('.rc-tabs-tab .rc-tabs-tab-btn').at(2).simulate('click'),
6363
},
6464
{
6565
name: 'inner button key down',
66-
trigger: (wrapper) =>
66+
trigger: wrapper =>
6767
wrapper.find('.rc-tabs-tab .rc-tabs-tab-btn').at(2).simulate('keydown', {
6868
which: KeyCode.SPACE,
6969
}),
@@ -81,6 +81,17 @@ describe('Tabs.Basic', () => {
8181
expect(onChange).toHaveBeenCalledWith('cute');
8282
});
8383
});
84+
85+
// https://github.com/ant-design/ant-design/issues/33032
86+
it('should not trigger onChange when click current tab', () => {
87+
const onChange = jest.fn();
88+
const onTabClick = jest.fn();
89+
const wrapper = mount(getTabs({ onChange, onTabClick }));
90+
91+
wrapper.find('.rc-tabs-tab').at(0).simulate('click');
92+
expect(onTabClick).toHaveBeenCalledWith('light', expect.anything());
93+
expect(onChange).not.toHaveBeenCalled();
94+
});
8495
});
8596

8697
it('active first tab when children is changed', () => {
@@ -93,7 +104,6 @@ describe('Tabs.Basic', () => {
93104
),
94105
});
95106
wrapper.update();
96-
97107
expect(wrapper.find('.rc-tabs-tab-active').text()).toEqual('Yo');
98108
});
99109

@@ -126,7 +136,7 @@ describe('Tabs.Basic', () => {
126136
const renderTabBar = jest.fn((props, Component) => {
127137
return (
128138
<div className="my-wrapper">
129-
<Component {...props}>{(node) => <span className="my-node">{node}</span>}</Component>
139+
<Component {...props}>{node => <span className="my-node">{node}</span>}</Component>
130140
</div>
131141
);
132142
});
@@ -136,10 +146,10 @@ describe('Tabs.Basic', () => {
136146
expect(renderTabBar).toHaveBeenCalled();
137147
});
138148
it('has panes property in props', () => {
139-
const renderTabBar = (props) => {
149+
const renderTabBar = props => {
140150
return (
141151
<div>
142-
{props.panes.map((pane) => (
152+
{props.panes.map(pane => (
143153
<span key={pane.key} data-key={pane.key}>
144154
tab
145155
</span>
@@ -194,7 +204,7 @@ describe('Tabs.Basic', () => {
194204
const list: { name: string; trigger: (node: ReactWrapper) => void }[] = [
195205
{
196206
name: 'click',
197-
trigger: (node) => {
207+
trigger: node => {
198208
node.simulate('click');
199209
},
200210
},

0 commit comments

Comments
 (0)