<template> <div :class="curClassName" :style="curStyle"> <template v-if="mutliData && mutliData.length > 0"> <template v-for="data, index of mutliData"> <template v-if="containerModel.length > 0"> <div v-for="name of containerModel" class="container-item__pos" :style="getItemPosStyle(name)"> <slot :name="name" :data="{ index }"></slot> </div> </template> </template> </template> <template v-else> <template v-if="containerModel.length > 0"> <div v-for="name of containerModel" class="container-item__pos" :style="getItemPosStyle(name)"> <slot :name="name"></slot> </div> </template> </template> </div> </template> <script lang="ts"> import { Component, Prop, Vue, Watch } from 'vue-property-decorator'; @Component({}) export default class AppStandardContainer extends Vue { /** * 名称 * * @type {string} * @memberof AppStandardContainer */ @Prop() public name!: string; /** * 下标 * * @type {number} * @memberof AppStandardContainer */ @Prop() public index?: number; /** * 布局模型详情 * * @type {string} * @memberof AppStandardContainer */ @Prop() public layoutModelDetails: any; /** * 是否为多数据容器 * * @type {boolean} * @memberof AppStandardContainer */ @Prop() public isMultiContainer!:boolean; /** * 项名称 * * @type {*} * @memberof AppStandardContainer */ get itemName() { return (this.index || this.index === 0) ? `${this.name}_${this.index}` : this.name; } /** * 多数据容器值 * * @type {*} * @memberof AppStandardContainer */ get mutliData() { if (this.isMultiContainer && this.isMultiContainer === true) { if (this.layoutModelDetails[this.itemName]) { return this.layoutModelDetails[this.itemName].getData(); } } } /** * 布局模型详情变更 * @param newVal * @param oldVal */ @Watch('layoutModelDetails') onLayoutModelDetailsChange(newVal: any, oldVal: any) { this.initStandardContainer(); } /** * 插槽对象 * * @memberof AppStandardContainer */ public containerModel: any[] = []; /** * 初始化常规容器 * * @memberof AppStandardContainer */ public initStandardContainer() { this.containerModel = []; const curLayoutModel = this.layoutModelDetails[this.itemName]; if (curLayoutModel && curLayoutModel.details && curLayoutModel.details.length > 0) { curLayoutModel.details.forEach((key: string) => { this.containerModel.push(key); }) } } /** * 当前容器样式类 */ get curClassName() { const layoutModel = this.layoutModelDetails[this.itemName]; if (layoutModel) { return `app-standard-container ${this.itemName} ${layoutModel.sysCss}`; } } /** * 当前容器样式 */ get curStyle() { const layoutModel = this.layoutModelDetails[this.itemName]; if (layoutModel) { return layoutModel.getElementStyle(); } } /** * 获取项布局样式 */ public getItemPosStyle(name: string) { let layoutModel: any; if ((this.index || this.index === 0)) { layoutModel = this.layoutModelDetails[`${name}_${this.index}`]; } else { layoutModel = this.layoutModelDetails[name]; } if (layoutModel) { return layoutModel.getBoxLayOutStyle(); } } } </script> <style lang='scss'> @import 'app-standard-container.scss'; </style>