Commit e45d1bce143de266cdca3dc38c4823344af4c53d
1 parent
354254b4
fix too early visibility change, trigger update on mounted
Showing
1 changed file
with
21 additions
and
12 deletions
Show diff stats
src/components/tabs/tabs.vue
| @@ -133,7 +133,7 @@ | @@ -133,7 +133,7 @@ | ||
| 133 | ]; | 133 | ]; |
| 134 | }, | 134 | }, |
| 135 | contentStyle () { | 135 | contentStyle () { |
| 136 | - const x = this.navList.findIndex((nav) => nav.name === this.activeKey); | 136 | + const x = this.getTabIndex(this.activeKey); |
| 137 | const p = x === 0 ? '0%' : `-${x}00%`; | 137 | const p = x === 0 ? '0%' : `-${x}00%`; |
| 138 | 138 | ||
| 139 | let style = {}; | 139 | let style = {}; |
| @@ -184,7 +184,7 @@ | @@ -184,7 +184,7 @@ | ||
| 184 | }, | 184 | }, |
| 185 | updateBar () { | 185 | updateBar () { |
| 186 | this.$nextTick(() => { | 186 | this.$nextTick(() => { |
| 187 | - const index = this.navList.findIndex((nav) => nav.name === this.activeKey); | 187 | + const index = this.getTabIndex(this.activeKey); |
| 188 | if (!this.$refs.nav) return; // 页面销毁时,这里会报错,为了解决 #2100 | 188 | if (!this.$refs.nav) return; // 页面销毁时,这里会报错,为了解决 #2100 |
| 189 | const prevTabs = this.$refs.nav.querySelectorAll(`.${prefixCls}-tab`); | 189 | const prevTabs = this.$refs.nav.querySelectorAll(`.${prefixCls}-tab`); |
| 190 | const tab = prevTabs[index]; | 190 | const tab = prevTabs[index]; |
| @@ -239,7 +239,7 @@ | @@ -239,7 +239,7 @@ | ||
| 239 | handleTabKeyboardSelect(init = false){ | 239 | handleTabKeyboardSelect(init = false){ |
| 240 | if (init) return; | 240 | if (init) return; |
| 241 | const focused = this.focusedKey || 0; | 241 | const focused = this.focusedKey || 0; |
| 242 | - const index = this.navList.findIndex(({name}) => name === focused); | 242 | + const index = this.getTabIndex(focused); |
| 243 | this.handleChange(index); | 243 | this.handleChange(index); |
| 244 | }, | 244 | }, |
| 245 | handleRemove (index) { | 245 | handleRemove (index) { |
| @@ -310,6 +310,9 @@ | @@ -310,6 +310,9 @@ | ||
| 310 | ? Number(navStyle.transform.match(/translateX\(-(\d+(\.\d+)*)px\)/)[1]) | 310 | ? Number(navStyle.transform.match(/translateX\(-(\d+(\.\d+)*)px\)/)[1]) |
| 311 | : 0; | 311 | : 0; |
| 312 | }, | 312 | }, |
| 313 | + getTabIndex(name){ | ||
| 314 | + return this.navList.findIndex(nav => nav.name === name); | ||
| 315 | + }, | ||
| 313 | setOffset(value) { | 316 | setOffset(value) { |
| 314 | this.navStyle.transform = `translateX(-${value}px)`; | 317 | this.navStyle.transform = `translateX(-${value}px)`; |
| 315 | }, | 318 | }, |
| @@ -368,6 +371,18 @@ | @@ -368,6 +371,18 @@ | ||
| 368 | parentNode = parentNode.parentNode; | 371 | parentNode = parentNode.parentNode; |
| 369 | } | 372 | } |
| 370 | return false; | 373 | return false; |
| 374 | + }, | ||
| 375 | + updateVisibility(index){ | ||
| 376 | + [...this.$refs.panes.children].forEach((el, i) => { | ||
| 377 | + if (index === i) { | ||
| 378 | + [...el.children].forEach(child => child.style.visibility = 'visible'); | ||
| 379 | + setTimeout(() => focusFirst(el, el), transitionTime); | ||
| 380 | + } else { | ||
| 381 | + setTimeout(() => { | ||
| 382 | + [...el.children].forEach(child => child.style.visibility = 'hidden'); | ||
| 383 | + }, transitionTime); | ||
| 384 | + } | ||
| 385 | + }); | ||
| 371 | } | 386 | } |
| 372 | }, | 387 | }, |
| 373 | watch: { | 388 | watch: { |
| @@ -385,15 +400,8 @@ | @@ -385,15 +400,8 @@ | ||
| 385 | }); | 400 | }); |
| 386 | 401 | ||
| 387 | // update visibility | 402 | // update visibility |
| 388 | - const nextIndex = Math.max(this.navList.findIndex(tab => tab.name === this.focusedKey), 0); | ||
| 389 | - [...this.$refs.panes.children].forEach((el, i) => { | ||
| 390 | - if (nextIndex === i) { | ||
| 391 | - [...el.children].forEach(child => child.style.visibility = 'visible'); | ||
| 392 | - setTimeout(() => focusFirst(el, el), transitionTime); | ||
| 393 | - } else { | ||
| 394 | - [...el.children].forEach(child => child.style.visibility = 'hidden'); | ||
| 395 | - } | ||
| 396 | - }); | 403 | + const nextIndex = Math.max(this.getTabIndex(this.focusedKey), 0); |
| 404 | + this.updateVisibility(nextIndex); | ||
| 397 | } | 405 | } |
| 398 | }, | 406 | }, |
| 399 | mounted () { | 407 | mounted () { |
| @@ -414,6 +422,7 @@ | @@ -414,6 +422,7 @@ | ||
| 414 | } | 422 | } |
| 415 | 423 | ||
| 416 | this.handleTabKeyboardSelect(true); | 424 | this.handleTabKeyboardSelect(true); |
| 425 | + this.updateVisibility(this.getTabIndex(this.activeKey)); | ||
| 417 | }, | 426 | }, |
| 418 | beforeDestroy() { | 427 | beforeDestroy() { |
| 419 | this.observer.removeListener(this.$refs.navWrap, this.handleResize); | 428 | this.observer.removeListener(this.$refs.navWrap, this.handleResize); |