<template> <Tabs v-model="activeName" @on-click="handleClick" :name="name" :class="curClassName"> <template v-if="containerModel.length > 0"> <template v-for="name of containerModel"> <slot :name="name"></slot> </template> </template> </Tabs> </template> <script lang="ts"> import { Component, Prop, Vue, Watch } from 'vue-property-decorator'; @Component({}) export default class AppTabPanel extends Vue { /** * 名称 * * @type {string} * @memberof AppTabPanel */ @Prop() public name!: string; /** * 布局模型详情 * * @type {*} * @memberof AppTabPanel */ @Prop() public layoutModelDetails: any; /** * 下标 * * @type {number} * @memberof AppTabPanel */ @Prop() public index?: number; /** * 项名称 * * @type {*} * @memberof AppTabPanel */ get itemName() { return (this.index || this.index === 0) ? `${this.name}_${this.index}` : this.name; } /** * 插槽对象 * * @memberof AppTabPanel */ public containerModel: any[] = []; /** * 当前激活项 * * @memberof AppTabPanel */ public activeName: string = ''; /** * 布局模型详情变更 * @param newVal * @param oldVal */ @Watch('layoutModelDetails') onLayoutModelDetailsChange(newVal: any, oldVal: any) { this.initTabPanel(); } /** * 初始化分页 * * @memberof AppTabPanel */ public initTabPanel() { this.containerModel = []; const layoutModel = this.layoutModelDetails[this.itemName]; if (layoutModel && layoutModel.details && layoutModel.details.length > 0) { layoutModel.details.forEach((key: string) => { this.containerModel.push(key); }) } this.activeName = this.containerModel && this.containerModel.length > 0 ? this.containerModel[0] : ''; this.layoutModelDetails[this.itemName].clickPage(this.activeName); } /** * 处理分页点击 * * @memberof AppTabPanel */ public handleClick(tab: any) { if (this.layoutModelDetails[this.itemName]) { this.layoutModelDetails[this.itemName].clickPage(tab); } } /** * 当前容器类名 * * @memberof AppTabPanel */ get curClassName() { const layoutModel = this.layoutModelDetails[this.itemName]; if (layoutModel) { return `app-tab-panel ${this.itemName} ${layoutModel.sysCss}`; } } /** * 当前容器样式 * * @memberof AppTabPanel */ get curStyle() { const layoutModel = this.layoutModelDetails[this.itemName]; if (layoutModel) { return layoutModel.getElementStyle(); } } } </script> <style lang='scss'> @import './app-tab-panel.scss'; </style>