Skip to content

Commit 17d817c

Browse files
authored
Tabs: fix order of TabNav when array is sorted (#12846)
* Tabs: fix order of TabNav when array is sorted * update tabs.vue * update test cases
1 parent 34dd679 commit 17d817c

File tree

3 files changed

+29
-32
lines changed

3 files changed

+29
-32
lines changed

packages/tabs/src/tab-pane.vue

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,6 @@
4949
}
5050
},
5151
52-
mounted() {
53-
this.$parent.addPanes(this);
54-
},
55-
56-
destroyed() {
57-
if (this.$el && this.$el.parentNode) {
58-
this.$el.parentNode.removeChild(this.$el);
59-
}
60-
this.$parent.removePanes(this);
61-
},
62-
6352
watch: {
6453
label() {
6554
this.$parent.$forceUpdate();

packages/tabs/src/tabs.vue

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,17 @@
5353
},
5454
5555
methods: {
56+
calcPaneInstances() {
57+
if (this.$slots.default) {
58+
const paneSlots = this.$slots.default.filter(vnode => vnode.tag &&
59+
vnode.componentOptions && vnode.componentOptions.Ctor.options.name === 'ElTabPane');
60+
// update indeed
61+
const panes = paneSlots.map(({ componentInstance }) => componentInstance);
62+
if (!(panes.length === this.panes.length && panes.every((pane, index) => pane === this.panes[index]))) {
63+
this.panes = panes;
64+
}
65+
}
66+
},
5667
handleTabClick(tab, tabName, event) {
5768
if (tab.disabled) return;
5869
this.setCurrentName(tabName);
@@ -87,21 +98,9 @@
8798
} else {
8899
changeCurrentName();
89100
}
90-
},
91-
addPanes(item) {
92-
const index = this.$slots.default.filter(item => {
93-
return item.elm.nodeType === 1 && /\bel-tab-pane\b/.test(item.elm.className) || item.elm.nodeType === 8;
94-
}).indexOf(item.$vnode);
95-
this.panes.splice(index, 0, item);
96-
},
97-
removePanes(item) {
98-
const panes = this.panes;
99-
const index = panes.indexOf(item);
100-
if (index > -1) {
101-
panes.splice(index, 1);
102-
}
103101
}
104102
},
103+
105104
render(h) {
106105
let {
107106
type,
@@ -164,10 +163,19 @@
164163
</div>
165164
);
166165
},
166+
167167
created() {
168168
if (!this.currentName) {
169169
this.setCurrentName('0');
170170
}
171+
},
172+
173+
mounted() {
174+
this.calcPaneInstances();
175+
},
176+
177+
updated() {
178+
this.calcPaneInstances();
171179
}
172180
};
173181
</script>

test/unit/specs/tabs.spec.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -223,19 +223,19 @@ describe('Tabs', () => {
223223
const paneList = vm.$el.querySelector('.el-tabs__content').children;
224224

225225
tabList[1].querySelector('.el-icon-close').click();
226-
vm.$nextTick(_ => {
226+
setTimeout(_ => {
227227
expect(tabList.length).to.be.equal(2);
228228
expect(paneList.length).to.be.equal(2);
229229
expect(tabList[1].classList.contains('is-active')).to.be.true;
230230

231231
vm.$refs.tabs.$el.querySelector('.el-tabs__new-tab').click();
232-
vm.$nextTick(_ => {
232+
setTimeout(_ => {
233233
expect(tabList.length).to.be.equal(3);
234234
expect(paneList.length).to.be.equal(3);
235235
expect(tabList[2].classList.contains('is-active')).to.be.true;
236236
done();
237-
});
238-
});
237+
}, 100);
238+
}, 100);
239239
}, 100);
240240
});
241241
it('addable & closable', done => {
@@ -310,19 +310,19 @@ describe('Tabs', () => {
310310

311311
vm.$refs.tabs.$el.querySelector('.el-tabs__new-tab').click();
312312

313-
vm.$nextTick(_ => {
313+
setTimeout(_ => {
314314
expect(tabList.length).to.be.equal(3);
315315
expect(paneList.length).to.be.equal(3);
316316
expect(tabList[2].classList.contains('is-active')).to.be.true;
317317

318318
tabList[2].querySelector('.el-icon-close').click();
319-
vm.$nextTick(_ => {
319+
setTimeout(_ => {
320320
expect(tabList.length).to.be.equal(2);
321321
expect(paneList.length).to.be.equal(2);
322322
expect(tabList[1].classList.contains('is-active')).to.be.true;
323323
done();
324-
});
325-
});
324+
}, 100);
325+
}, 100);
326326
}, 100);
327327
});
328328
it('closable in tab-pane', (done) => {

0 commit comments

Comments
 (0)