fix dynamic change tabs bug

pull/2212/head
baiyaaaaa 2017-01-04 16:22:24 +08:00 committed by 杨奕
parent 0c0f2527e3
commit 5fb72444a6
3 changed files with 41 additions and 37 deletions

View File

@ -34,14 +34,15 @@
} }
}, },
created() { mounted() {
this.$parent.$forceUpdate(); this.$parent.addPanes(this);
}, },
destroyed() { destroyed() {
if (this.$el && this.$el.parentNode) { if (this.$el && this.$el.parentNode) {
this.$el.parentNode.removeChild(this.$el); this.$el.parentNode.removeChild(this.$el);
} }
this.$parent.removePanes(this);
}, },
watch: { watch: {

View File

@ -20,7 +20,8 @@
data() { data() {
return { return {
children: null, children: null,
currentName: this.value || this.activeName currentName: this.value || this.activeName,
panes: []
}; };
}, },
@ -34,16 +35,9 @@
}, },
computed: { computed: {
tabPanes: {
cache: false,
get() {
if (!this.$children) return [];
return this.$children.filter(item => item.$options.componentName === 'ElTabPane');
}
},
currentTab() { currentTab() {
let result; let result;
this.tabPanes.forEach(tab => { this.panes.forEach(tab => {
if (this.currentName === (tab.name || tab.index)) { if (this.currentName === (tab.name || tab.index)) {
result = tab; result = tab;
} }
@ -53,22 +47,25 @@
}, },
methods: { methods: {
handleTabRemove(tab, event) { handleTabRemove(pane, event) {
event.stopPropagation(); event.stopPropagation();
const tabs = this.tabPanes; const panes = this.panes;
const currentTab = this.currentTab; const currentTab = this.currentTab;
let index = tabs.indexOf(tab); let index = panes.indexOf(pane);
tab.$destroy();
this.$emit('tab-remove', tab); if (index === -1) return;
this.$forceUpdate();
panes.splice(index, 1);
pane.$destroy();
this.$emit('tab-remove', pane);
this.$nextTick(_ => { this.$nextTick(_ => {
if (tab.active) { if (pane.active) {
const tabs = this.tabPanes; const panes = this.panes;
let nextChild = tabs[index]; let nextChild = panes[index];
let prevChild = tabs[index - 1]; let prevChild = panes[index - 1];
let nextActiveTab = nextChild || prevChild || null; let nextActiveTab = nextChild || prevChild || null;
if (nextActiveTab) { if (nextActiveTab) {
@ -88,10 +85,17 @@
setCurrentName(value) { setCurrentName(value) {
this.currentName = value; this.currentName = value;
this.$emit('input', value); this.$emit('input', value);
}
}, },
mounted() { addPanes(item) {
this.$forceUpdate(); this.panes.push(item);
},
removePanes(item) {
const panes = this.panes;
const index = panes.indexOf(item);
if (index > -1) {
panes.splice(index, 1);
}
}
}, },
render(h) { render(h) {
let { let {
@ -99,33 +103,33 @@
handleTabRemove, handleTabRemove,
handleTabClick, handleTabClick,
currentName, currentName,
tabPanes panes
} = this; } = this;
const tabs = this._l(tabPanes, (tab, index) => { const tabs = this._l(panes, (pane, index) => {
let tabName = tab.name || tab.index || index; let tabName = pane.name || pane.index || index;
if (currentName === undefined && index === 0) { if (currentName === undefined && index === 0) {
this.setCurrentName(tabName); this.setCurrentName(tabName);
} }
tab.index = index; pane.index = index;
const btnClose = tab.isClosable const btnClose = pane.isClosable
? <span class="el-icon-close" on-click={(ev) => { handleTabRemove(tab, ev); }}></span> ? <span class="el-icon-close" on-click={(ev) => { handleTabRemove(pane, ev); }}></span>
: null; : null;
const tabLabelContent = tab.$slots.label || tab.label; const tabLabelContent = pane.$slots.label || pane.label;
return ( return (
<div <div
class={{ class={{
'el-tabs__item': true, 'el-tabs__item': true,
'is-active': tab.active, 'is-active': pane.active,
'is-disabled': tab.disabled, 'is-disabled': pane.disabled,
'is-closable': tab.isClosable 'is-closable': pane.isClosable
}} }}
ref="tabs" ref="tabs"
refInFor refInFor
on-click={(ev) => { handleTabClick(tab, tabName, ev); }} on-click={(ev) => { handleTabClick(pane, tabName, ev); }}
> >
{tabLabelContent} {tabLabelContent}
{btnClose} {btnClose}
@ -140,7 +144,7 @@
'el-tabs--border-card': type === 'border-card' 'el-tabs--border-card': type === 'border-card'
}}> }}>
<div class="el-tabs__header"> <div class="el-tabs__header">
{!type ? <tab-bar tabs={tabPanes}></tab-bar> : null} {!type ? <tab-bar tabs={panes}></tab-bar> : null}
{tabs} {tabs}
</div> </div>
<div class="el-tabs__content"> <div class="el-tabs__content">

View File

@ -63,7 +63,6 @@ describe('Tabs', () => {
const tabList = vm.$refs.tabs.$refs.tabs; const tabList = vm.$refs.tabs.$refs.tabs;
expect(tabList[1].classList.contains('is-active')).to.be.true; expect(tabList[1].classList.contains('is-active')).to.be.true;
// expect(vm.$el.querySelector('.el-tabs__active-bar'))
expect(paneList[1].style.display).to.not.ok; expect(paneList[1].style.display).to.not.ok;
tabList[3].click(); tabList[3].click();