diff --git a/frontend/package.json b/frontend/package.json index 7715db9315..95669267f5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -18,6 +18,7 @@ "@riophae/vue-treeselect": "0.4.0", "axios": "^0.21.1", "echarts": "^5.0.2", + "element-resize-detector": "^1.2.2", "element-ui": "2.13.0", "fit2cloud-ui": "^0.1.12", "js-cookie": "2.2.0", diff --git a/frontend/src/components/canvas/components/Editor/Preview.vue b/frontend/src/components/canvas/components/Editor/Preview.vue index 58b8f9e879..fbf015a06c 100644 --- a/frontend/src/components/canvas/components/Editor/Preview.vue +++ b/frontend/src/components/canvas/components/Editor/Preview.vue @@ -1,20 +1,10 @@ @@ -23,6 +13,10 @@ import { getStyle } from '@/components/canvas/utils/style' import { mapState } from 'vuex' import ComponentWrapper from './ComponentWrapper' import { changeStyleWithScale } from '@/components/canvas/utils/translate' +import { uuid } from 'vue-uuid' +import { deepCopy } from '@/components/canvas/utils/utils' +import eventBus from '@/components/canvas/utils/eventBus' +import elementResizeDetectorMaker from 'element-resize-detector' export default { components: { ComponentWrapper }, @@ -36,20 +30,84 @@ export default { default: false } }, - computed: mapState([ - 'componentData', - 'canvasStyleData' - ]), + data() { + return { + isShowPreview: false, + panelId: '', + needToChangeHeight: [ + 'top', + 'height', + 'fontSize', + 'borderWidth' + ], + needToChangeWidth: [ + 'left', + 'width' + ], + scaleWidth: '100', + scaleHeight: '100', + timer: null, + componentDataShow: [] + } + }, + computed: { + // 此处单独计算componentData的值 不放入全局mapState中 + componentDataInfo() { + return this.componentDataShow + }, + ...mapState([ + 'componentData', + 'canvasStyleData' + ]) + }, mounted() { - // 计算组件当前合适宽度 + debugger + const _this = this + const erd = elementResizeDetectorMaker() + // 监听div变动事件 + erd.listenTo(document.getElementById('canvasInfo'), element => { + _this.$nextTick(() => { + _this.restore() + }) + }) + // 监听数据变动事件 + eventBus.$on('componentDataChange', () => { + _this.restore() + }) }, methods: { changeStyleWithScale, - getStyle, - - close() { - this.$emit('change', false) + restore() { + const canvasHeight = document.getElementById('canvasInfo').offsetHeight + const canvasWidth = document.getElementById('canvasInfo').offsetWidth + this.scaleWidth = canvasWidth * 100 / parseInt(this.canvasStyleData.width)// 获取宽度比 + this.scaleHeight = canvasHeight * 100 / parseInt(this.canvasStyleData.height)// 获取高度比 + this.handleScaleChange() + }, + resetID(data) { + data.forEach(item => { + item.id = uuid.v1() + }) + return data + }, + format(value, scale) { + return value * parseInt(scale) / 100 + }, + handleScaleChange() { + const componentData = deepCopy(this.componentData) + componentData.forEach(component => { + Object.keys(component.style).forEach(key => { + if (this.needToChangeHeight.includes(key)) { + component.style[key] = this.format(component.style[key], this.scaleHeight) + } + if (this.needToChangeWidth.includes(key)) { + component.style[key] = this.format(component.style[key], this.scaleWidth) + } + }) + }) + this.componentDataShow = componentData + eventBus.$emit('resizing', '') } } } @@ -57,12 +115,14 @@ export default { diff --git a/frontend/src/views/panel/index.vue b/frontend/src/views/panel/index.vue index a2a29bf107..32ca274ad3 100644 --- a/frontend/src/views/panel/index.vue +++ b/frontend/src/views/panel/index.vue @@ -1,5 +1,5 @@