@@ -11,7 +11,7 @@ import type {
11
11
Tab,
12
12
} from './interface';
13
13
import type { CSSProperties, PropType, ExtractPropTypes } from 'vue';
14
- import { defineComponent, computed, onMounted, watchEffect, camelize } from 'vue';
14
+ import { ref, defineComponent, computed, onMounted, watchEffect, camelize } from 'vue';
15
15
import { flattenChildren, initDefaultProps, isValidElement } from '../../_util/props-util';
16
16
import useConfigInject from '../../_util/hooks/useConfigInject';
17
17
import useState from '../../_util/hooks/useState';
@@ -181,19 +181,24 @@ const InternalTabs = defineComponent({
181
181
});
182
182
183
183
// ====================== Active Key ======================
184
- const [mergedActiveKey, setMergedActiveKey] = useMergedState<Key>(() => props.tabs[0]?.key, {
184
+ // use activeKey & mergedActiveKey to control
185
+ // https://github.com/vueComponent/ant-design-vue/issues/5056
186
+ const [activeKey] = useMergedState<Key>(() => props.tabs[0]?.key, {
185
187
value: computed(() => props.activeKey),
186
188
defaultValue: props.defaultActiveKey,
187
189
});
190
+ const mergedActiveKey = ref<Key>();
188
191
const [activeIndex, setActiveIndex] = useState(() =>
189
192
props.tabs.findIndex(tab => tab.key === mergedActiveKey.value),
190
193
);
191
194
192
195
watchEffect(() => {
193
- let newActiveIndex = props.tabs.findIndex(tab => tab.key === mergedActiveKey .value);
196
+ let newActiveIndex = props.tabs.findIndex(tab => tab.key === activeKey .value);
194
197
if (newActiveIndex === -1) {
195
198
newActiveIndex = Math.max(0, Math.min(activeIndex.value, props.tabs.length - 1));
196
199
mergedActiveKey.value = props.tabs[newActiveIndex]?.key;
200
+ } else {
201
+ mergedActiveKey.value = activeKey.value;
197
202
}
198
203
setActiveIndex(newActiveIndex);
199
204
});
@@ -221,9 +226,11 @@ const InternalTabs = defineComponent({
221
226
// ======================== Events ========================
222
227
const onInternalTabClick = (key: Key, e: MouseEvent | KeyboardEvent) => {
223
228
props.onTabClick?.(key, e);
224
-
225
- setMergedActiveKey(key);
226
- props.onChange?.(key);
229
+ const isActiveChanged = key !== mergedActiveKey.value;
230
+ if (isActiveChanged) {
231
+ mergedActiveKey.value = key;
232
+ props.onChange?.(key);
233
+ }
227
234
};
228
235
229
236
useProvideTabs({
0 commit comments