Skip to content

Instantly share code, notes, and snippets.

@blocka
Created November 13, 2017 09:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save blocka/83637959e1303673dc0af9ae9129fcbb to your computer and use it in GitHub Desktop.
Save blocka/83637959e1303673dc0af9ae9129fcbb to your computer and use it in GitHub Desktop.
Simple, flexible tabs
<template>
<Tabs initialTab="login">
<TabNav tabId="login">
<template scope="{active, selectTab}">
<a>Login</a>
</template>
</TabNav>
<TabNav tabId="register">
<template scope="{active, selectTab}">
<a>Registration</a>
</template>
</TabNav>
<TabNav tabId="forgot">
<template scope="{active, selectTab}">
<a>Forgot Password</a>
</template>
</TabNav>
<TabPanel tabId="login">
Login Panel
</TabPanel>
<TabPanel tabId="register">
Register Panel
</TabPanel>
<TabPanel tabId="forgot">
Forgot Password panel
</TabPanel>
</Tabs>
</template>
import Tabs from './Tabs';
import TabNav from './TabNav';
import TabPanel from './TabPanel';
export { Tabs, TabNav, TabPanel };
import set from 'lodash/set';
export default {
props: ['tabId'],
inject: ['tabs'],
render (h) {
const vnodes = this.$scopedSlots.default({
active: this.tabs.tabData.activeTab === this.tabId
});
const vnode = vnodes.length > 1
? h('div', [vnodes])
: vnodes[0];
set(vnode, 'data.on.click', () => this.tabs.selectTab(this.tabId));
set(vnode, 'data.nativeOn.click', () => this.tabs.selectTab(this.tabId));
return vnode;
}
};
export default {
props: ['tabId'],
inject: ['tabs'],
render (h) {
if (this.tabId !== this.tabs.tabData.activeTab) {
return null;
}
const vnodes = this.$slots.default;
const vnode = vnodes.length > 1
? h('div', [vnodes])
: vnodes[0];
return vnode;
}
};
export default {
props: ['initialTab'],
data () {
return {
tabData: {
activeTab: this.initialTab
}
};
},
provide () {
return {
tabs: {
selectTab: this.selectTab,
tabData: this.tabData
}
};
},
methods: {
selectTab (tab) {
this.tabData.activeTab = tab;
}
},
render (h) {
return h('div', [this.$slots.default]);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment