Skip to content

Commit 02e6fec

Browse files
committed
fix: tabs not update, close #5056
1 parent 5cc1bd7 commit 02e6fec

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

components/tabs/src/Tabs.tsx

+13-6
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import type {
1111
Tab,
1212
} from './interface';
1313
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';
1515
import { flattenChildren, initDefaultProps, isValidElement } from '../../_util/props-util';
1616
import useConfigInject from '../../_util/hooks/useConfigInject';
1717
import useState from '../../_util/hooks/useState';
@@ -181,19 +181,24 @@ const InternalTabs = defineComponent({
181181
});
182182

183183
// ====================== 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, {
185187
value: computed(() => props.activeKey),
186188
defaultValue: props.defaultActiveKey,
187189
});
190+
const mergedActiveKey = ref<Key>();
188191
const [activeIndex, setActiveIndex] = useState(() =>
189192
props.tabs.findIndex(tab => tab.key === mergedActiveKey.value),
190193
);
191194

192195
watchEffect(() => {
193-
let newActiveIndex = props.tabs.findIndex(tab => tab.key === mergedActiveKey.value);
196+
let newActiveIndex = props.tabs.findIndex(tab => tab.key === activeKey.value);
194197
if (newActiveIndex === -1) {
195198
newActiveIndex = Math.max(0, Math.min(activeIndex.value, props.tabs.length - 1));
196199
mergedActiveKey.value = props.tabs[newActiveIndex]?.key;
200+
} else {
201+
mergedActiveKey.value = activeKey.value;
197202
}
198203
setActiveIndex(newActiveIndex);
199204
});
@@ -221,9 +226,11 @@ const InternalTabs = defineComponent({
221226
// ======================== Events ========================
222227
const onInternalTabClick = (key: Key, e: MouseEvent | KeyboardEvent) => {
223228
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+
}
227234
};
228235

229236
useProvideTabs({

0 commit comments

Comments
 (0)