<template> <div :class="curClassName" :style="curStyleContent"> <template v-if="containerModel.length > 0"> <template v-for="name of containerModel"> <slot :name="name"></slot> </template> </template> </div> </template> <script lang="ts"> import { Component, Prop, Vue } from 'vue-property-decorator'; @Component({}) export default class AppSimpleFlexContainer extends Vue { /** * 名称 * * @type {string} * @memberof AppSimpleFlexContainer */ @Prop() public name!: string; /** * 布局模型详情 * * @type {string} * @memberof AppSimpleFlexContainer */ @Prop() public layoutModelDetails: any; /** * 插槽对象 * * @memberof AppSimpleFlexContainer */ public containerModel: any[] = []; /** * 组件初始化 * * @memberof SimpleFlexContainer */ public created() { this.initSimpleFlexContainer(); } /** * 初始化SIMPLEFLEX容器 * * @memberof SimpleFlexContainer */ public initSimpleFlexContainer() { const curLayoutModel = this.layoutModelDetails[this.name]; if (curLayoutModel && curLayoutModel.details && curLayoutModel.details.length > 0) { curLayoutModel.details.forEach((key: string) => { this.containerModel.push(key); }) } } /** * 当前容器样式类 */ get curClassName() { return `app-simpleflex-container ${this.name}`; } /** * 当前容器样式 */ get curStyleContent() { let boxLayoutPosStyle = ""; const curLayoutModel = this.layoutModelDetails[this.name]; if (curLayoutModel) { const { layout, flexGrow } = curLayoutModel; // 识别FLEX占位属性 if (layout && layout == 'FLEX') { boxLayoutPosStyle += `'flex-grow': ${flexGrow ? flexGrow : 0};`; } // 识别SIMPLEFLEX占位属性 if (layout == 'SIMPLEFLEX') { if (flexGrow) { boxLayoutPosStyle += `width: ${(100 / 12) * flexGrow}%;height: 100%;`; } else { // 简单FLEX布局自适应 boxLayoutPosStyle += `flex-grow:1;min-width:${(100 / 12)}%;height:100%;`; } } // 识别边缘布局占位属性 if (layout == 'BORDER') { boxLayoutPosStyle += `display:flex;`; } } return boxLayoutPosStyle; } } </script> <style lang='less'> @import 'app-simpleflex-container.less'; </style>