vue3.x + vite2.x + vant + element-plus H5移动端低代码平台 lowcode 可视化拖拽 可视化编辑器 visual editor 类似易企秀的H5制作、建站工具、可视化搭建工具
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

88 lines
1.8 KiB

<template>
<el-dialog v-model="dialogVisible" custom-class="h5-preview" :show-close="false" width="360px">
<iframe
style="width: 360px; height: 640px"
:src="`${BASE_URL}preview/#/`"
frameborder="0"
scrolling="auto"
></iframe>
</el-dialog>
</template>
<script lang="tsx">
import { defineComponent, reactive, watch, toRefs } from 'vue'
import { useVModel } from '@vueuse/core'
import { cloneDeep } from 'lodash'
import { BASE_URL } from '@/visual-editor/utils'
/**
* @name: preview
* @author: 卜启缘
* @date: 2021/4/29 23:09
* @description:preview
* @update: 2021/4/29 23:09
*/
export default defineComponent({
name: 'Preview',
props: {
visible: {
type: Boolean,
default: false
}
},
emits: ['update:visible'],
setup(props, { emit }) {
const state = reactive({
dialogVisible: useVModel(props, 'visible', emit),
jsonDataClone: cloneDeep(props.jsonData)
})
watch(
() => state.dialogVisible,
(val) => {
if (val) {
state.jsonDataClone = cloneDeep(props.jsonData)
}
}
)
const renderCom = (element) => {
if (Array.isArray(element)) {
return element.map((item) => renderCom(item))
}
const component = props.config.componentMap[element.componentKey]
return component.render({
size: {},
props: element.props || {},
block: element,
model: {},
custom: {}
})
}
return {
...toRefs(state),
BASE_URL,
renderCom
}
}
})
</script>
<style lang="scss">
.h5-preview {
overflow: hidden;
.el-dialog__body {
padding: 0;
}
.el-dialog__header {
display: none;
}
.simulator {
padding-right: 0;
&::-webkit-scrollbar {
width: 0;
}
}
}
</style>