<template> <div class="eContainer-home"> <c-row :gutter="10" v-for="cRow in cellRows" :key="cRow" > <c-col :span="24 / cellCols" v-for="cCol in cellCols" :key="cCol" > <component v-if="getComponentName([cRow - 1], [cCol - 1])" v-bind:is="getComponentName([cRow - 1], [cCol - 1])" :cellContentHeight="cellContentHeight" ></component> </c-col> </c-row> </div> </template> <script> import { createNamespacedHelpers } from "vuex"; const { mapState } = createNamespacedHelpers("UserContext"); import QuickVisit from "./cells/QuickVisit.vue"; import TaskStatistics from "./cells/TaskStatistics.vue"; import NoticeAnnouncement from "./cells/NoticeAnnouncement.vue"; import Hall from "./cells/Hall.vue"; import CustomerAnalyse from "./cells/CustomerAnalyse.vue"; import QuickSearch from "./cells/QuickSearch.vue"; import { cellDataDefinition } from "./config"; export default { name: "Home", components: { QuickVisit, TaskStatistics, NoticeAnnouncement, Hall, CustomerAnalyse, QuickSearch, }, data() { return { cellContentHeight: 0, }; }, created() { this.loadCellData(); }, mounted() { this.calcCellContentHeight(); this.calcCellContentHeightBind = this.calcCellContentHeight.bind(this); window.addEventListener("resize", this.calcCellContentHeightBind); }, computed: { ...mapState({ cellRows: (state) => state.homeCellsSetting.cellRows, cellCols: (state) => state.homeCellsSetting.cellCols, cellNames: (state) => state.homeCellsSetting.cellNames, }), }, watch: { cellRows(newVal, oldVal) { this.calcCellContentHeight() }, }, methods: { loadCellData() { this.$store.commit( "UserContext/setHomeDefaultCells", cellDataDefinition ); let cellsSettingDefault = localStorage.getItem("cells-setting-default"); if (!cellsSettingDefault) { const rows = 2; const cols = 3; localStorage.setItem( "cells-setting-default", JSON.stringify({ cellRows: rows, cellCols: cols, cellNames: this.generateRowColNames( rows, cols, cellDataDefinition.map((definition) => definition.name) ), }) ); } let userCellsSetting = localStorage.getItem( `cells-setting-${this.$store.state.UserContext.userId}` ); if (!userCellsSetting) { userCellsSetting = localStorage.getItem("cells-setting-default"); } this.$store.commit( "UserContext/setHomeCellsSetting", JSON.parse(userCellsSetting) ); }, generateRowColNames(rows, cols, cells) { const rArr = []; for (let i = 0; i < rows; i++) { const cArr = []; for (let j = 0; j < cols; j++) { cArr.push(cells[i * cols + j]); } rArr.push(cArr); } return rArr; }, getComponentName(rowIdx, colIdx) { return this.cellNames[rowIdx] ? this.cellNames[rowIdx][colIdx] : null; }, calcCellContentHeight() { this.cellContentHeight = this.$el.clientHeight * this.getRowHeightPercent() - 52 - 10 }, getRowHeightPercent() { // 每行预留 0.4% 的间距 return 1 / this.cellRows - 0.004 * this.cellRows; }, }, destroyed() { window.removeEventListener("resize", this.calcCellContentHeightBind); }, }; </script> <style scoped> .eContainer-home { height: 100%; display: flex; flex-direction: column; justify-content: space-around; } </style>