dataease-dm/frontend/src/components/canvas/custom-component/Group.vue
2021-06-24 14:31:01 +08:00

69 lines
1.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="group">
<div>
<template v-for="item in propValue">
<component
:is="item.component"
:id="'component' + item.id"
:key="item.id"
class="component"
:style="item.groupStyle"
:prop-value="item.propValue"
:element="item"
/>
</template>
</div>
</div>
</template>
<script>
import { getStyle } from '@/components/canvas/utils/style'
export default {
props: {
propValue: {
type: Array,
default: () => []
},
// eslint-disable-next-line vue/require-default-prop
element: {
type: Object
}
},
created() {
const parentStyle = this.element.style
this.propValue.forEach(component => {
// component.groupStyle 的 top left 是相对于 group 组件的位置
// 如果已存在 component.groupStyle说明已经计算过一次了。不需要再次计算
if (!Object.keys(component.groupStyle).length) {
const style = { ...component.style }
component.groupStyle = getStyle(style)
component.groupStyle.left = this.toPercent((style.left - parentStyle.left) / parentStyle.width)
component.groupStyle.top = this.toPercent((style.top - parentStyle.top) / parentStyle.height)
component.groupStyle.width = this.toPercent(style.width / parentStyle.width)
component.groupStyle.height = this.toPercent(style.height / parentStyle.height)
}
})
},
methods: {
toPercent(val) {
return val * 100 + '%'
}
}
}
</script>
<style lang="scss" scoped>
.group {
& > div {
position: relative;
width: 100%;
height: 100%;
.component {
position: absolute;
}
}
}
</style>