diff --git a/packages/tabs/src/tab-pane.vue b/packages/tabs/src/tab-pane.vue index be2b41140..a93ece270 100644 --- a/packages/tabs/src/tab-pane.vue +++ b/packages/tabs/src/tab-pane.vue @@ -34,14 +34,15 @@ } }, - created() { - this.$parent.$forceUpdate(); + mounted() { + this.$parent.addPanes(this); }, destroyed() { if (this.$el && this.$el.parentNode) { this.$el.parentNode.removeChild(this.$el); } + this.$parent.removePanes(this); }, watch: { diff --git a/packages/tabs/src/tabs.vue b/packages/tabs/src/tabs.vue index 32b6339b7..3f1d91b62 100644 --- a/packages/tabs/src/tabs.vue +++ b/packages/tabs/src/tabs.vue @@ -20,7 +20,8 @@ data() { return { children: null, - currentName: this.value || this.activeName + currentName: this.value || this.activeName, + panes: [] }; }, @@ -34,16 +35,9 @@ }, computed: { - tabPanes: { - cache: false, - get() { - if (!this.$children) return []; - return this.$children.filter(item => item.$options.componentName === 'ElTabPane'); - } - }, currentTab() { let result; - this.tabPanes.forEach(tab => { + this.panes.forEach(tab => { if (this.currentName === (tab.name || tab.index)) { result = tab; } @@ -53,22 +47,25 @@ }, methods: { - handleTabRemove(tab, event) { + handleTabRemove(pane, event) { event.stopPropagation(); - const tabs = this.tabPanes; + const panes = this.panes; const currentTab = this.currentTab; - let index = tabs.indexOf(tab); - tab.$destroy(); + let index = panes.indexOf(pane); - this.$emit('tab-remove', tab); - this.$forceUpdate(); + if (index === -1) return; + + panes.splice(index, 1); + pane.$destroy(); + + this.$emit('tab-remove', pane); this.$nextTick(_ => { - if (tab.active) { - const tabs = this.tabPanes; - let nextChild = tabs[index]; - let prevChild = tabs[index - 1]; + if (pane.active) { + const panes = this.panes; + let nextChild = panes[index]; + let prevChild = panes[index - 1]; let nextActiveTab = nextChild || prevChild || null; if (nextActiveTab) { @@ -88,44 +85,51 @@ setCurrentName(value) { this.currentName = value; this.$emit('input', value); + }, + addPanes(item) { + this.panes.push(item); + }, + removePanes(item) { + const panes = this.panes; + const index = panes.indexOf(item); + if (index > -1) { + panes.splice(index, 1); + } } }, - mounted() { - this.$forceUpdate(); - }, render(h) { let { type, handleTabRemove, handleTabClick, currentName, - tabPanes + panes } = this; - const tabs = this._l(tabPanes, (tab, index) => { - let tabName = tab.name || tab.index || index; + const tabs = this._l(panes, (pane, index) => { + let tabName = pane.name || pane.index || index; if (currentName === undefined && index === 0) { this.setCurrentName(tabName); } - tab.index = index; + pane.index = index; - const btnClose = tab.isClosable - ?
+ const btnClose = pane.isClosable + ? : null; - const tabLabelContent = tab.$slots.label || tab.label; + const tabLabelContent = pane.$slots.label || pane.label; return (