@@ -11,7 +11,7 @@ import type {
1111 Tab ,
1212} from './interface' ;
1313import 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' ;
1515import { flattenChildren , initDefaultProps , isValidElement } from '../../_util/props-util' ;
1616import useConfigInject from '../../_util/hooks/useConfigInject' ;
1717import 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