@@ -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