<template> <div :class="curClassName"> <div v-if="containerModel.NORTH" :style="containerModel.NORTH.style" class="no-style overflow-auto app-scroll-container__header"> <template v-for="name of containerModel.NORTH.name"> <slot :name="name"></slot> </template> </div> <div class="app-scroll-container__middle" :style="middleContainerStyle"> <div v-if="containerModel.WEST" :style="containerModel.WEST.style" class="no-style overflow-auto app-scroll-container__left"> <template v-for="name of containerModel.WEST.name"> <slot :name="name"></slot> </template> </div> <div v-if="containerModel.CENTER" :style="containerModel.CENTER.style" class="no-style overflow-auto app-scroll-container__center"> <template v-for="name of containerModel.CENTER.name"> <slot :name="name"></slot> </template> </div> <div v-if="containerModel.EAST" :style="containerModel.EAST.style" class="no-style overflow-auto app-scroll-container__right"> <template v-for="name of containerModel.EAST.name"> <slot :name="name"></slot> </template> </div> </div> <div v-if="containerModel.SOUTH" :style="containerModel.SOUTH.style" class="no-style overflow-auto app-scroll-container__bottom"> <template v-for="name of containerModel.SOUTH.name"> <slot :name="name"></slot> </template> </div> </div> </template> <script lang="ts"> import { Util } from '@/utils'; import { Component, Prop, Vue } from 'vue-property-decorator'; @Component({}) export default class AppScrollContainer extends Vue { /** * 名称 * * @type {string} * @memberof AppScrollContainer */ @Prop() public name!: string; /** * 布局模型详情 * * @type {string} * @memberof AppScrollContainer */ @Prop() public layoutModelDetails: any; /** * 插槽对象 * * @memberof AppScrollContainer */ public containerModel: any = {}; /** * 中间区域样式 * * @memberof AppScrollContainer */ public middleContainerStyle: any = {}; /** * 当前容器样式类 */ get curClassName(){ return `app-scroll-container ${this.name}`; } /** * 组件初始化 * * @memberof AppScrollContainer */ public created() { this.initScrollContainer(); } /** * 初始化滚动容器 * * @memberof AppScrollContainer */ public initScrollContainer() { let minusHeight = ''; let minusWidth:string = ''; const curLayoutModel = this.layoutModelDetails[this.name]; if (curLayoutModel && curLayoutModel.details && curLayoutModel.details.length > 0) { curLayoutModel.details.forEach((key: string) => { const { name, layoutWidth, widthMode, layoutHeight, heightMode, layoutPos } = this.layoutModelDetails[key]; const style = {}; if (layoutWidth) { Object.assign(style, { width: Util.getBoxSize('WIDTH', widthMode, layoutWidth).width }); if (layoutPos && (Object.is(layoutPos, 'WEST') || Object.is(layoutPos, 'EAST'))) { minusWidth += ` - ${Util.getBoxSize('WIDTH', widthMode, layoutWidth).width}`; } } if (layoutHeight) { Object.assign(style, { height: Util.getBoxSize('HEIGHT', heightMode, layoutHeight).height }); if (layoutPos && (Object.is(layoutPos, 'NORTH') || Object.is(layoutPos, 'SOUTH'))) { minusHeight += ` - ${Util.getBoxSize('HEIGHT', heightMode, layoutHeight).height}`; } } if (this.containerModel.hasOwnProperty(layoutPos)) { Object.assign(this.containerModel[layoutPos], { style }); this.containerModel[layoutPos].name.push(name); } else { this.containerModel[layoutPos] = { style, name: [name] }; } }); } this.middleContainerStyle.height = minusHeight ? `calc(100%${minusHeight})` : '100%'; if (this.containerModel.CENTER) { this.containerModel.CENTER.style.width = minusWidth ? `calc(100%${minusWidth})` : '100%'; } } } </script> <style lang='less'> @import 'app-scroll-container.less'; </style>