76 lines
1.4 KiB
JavaScript
76 lines
1.4 KiB
JavaScript
export default {
|
|
props: {
|
|
stopPropagation: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: false,
|
|
},
|
|
},
|
|
data() {
|
|
return {
|
|
currentIndex: 0,
|
|
tabs: [],
|
|
};
|
|
},
|
|
mounted() {
|
|
this.updateTabs();
|
|
},
|
|
methods: {
|
|
updateTabs() {
|
|
this.tabs = this.$children.filter(child => child.isTab);
|
|
this.currentIndex = this.tabs.findIndex(tab => tab.localActive);
|
|
},
|
|
setTab(e, index) {
|
|
if (this.stopPropagation) {
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
}
|
|
|
|
this.tabs[this.currentIndex].localActive = false;
|
|
this.tabs[index].localActive = true;
|
|
|
|
this.currentIndex = index;
|
|
},
|
|
},
|
|
render(h) {
|
|
const navItems = this.tabs.map((tab, i) =>
|
|
h(
|
|
'li',
|
|
{
|
|
key: i,
|
|
},
|
|
[
|
|
h(
|
|
'a',
|
|
{
|
|
class: tab.localActive ? 'active' : null,
|
|
attrs: {
|
|
href: '#',
|
|
},
|
|
on: {
|
|
click: e => this.setTab(e, i),
|
|
},
|
|
},
|
|
tab.$slots.title || tab.title,
|
|
),
|
|
],
|
|
),
|
|
);
|
|
const nav = h(
|
|
'ul',
|
|
{
|
|
class: 'nav-links tab-links',
|
|
},
|
|
[navItems],
|
|
);
|
|
const content = h(
|
|
'div',
|
|
{
|
|
class: ['tab-content'],
|
|
},
|
|
[this.$slots.default],
|
|
);
|
|
|
|
return h('div', {}, [[nav], content]);
|
|
},
|
|
};
|