parent
925d71cc5a
commit
ea986f3e6e
@ -0,0 +1,19 @@ |
||||
<template> |
||||
<div> |
||||
<router-view #="{ Component }"> |
||||
<component :is="Component" /> |
||||
</router-view> |
||||
</div> |
||||
</template> |
||||
|
||||
<script lang="ts"> |
||||
export default { |
||||
name: 'App' |
||||
} |
||||
</script> |
||||
|
||||
<style> |
||||
body::-webkit-scrollbar { |
||||
width: 0; |
||||
} |
||||
</style> |
@ -0,0 +1,13 @@ |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="UTF-8" /> |
||||
<link rel="icon" href="/favicon.ico" /> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
||||
<title>第二个页面</title> |
||||
</head> |
||||
<body> |
||||
<div id="app"></div> |
||||
<script type="module" src="./main.ts"></script> |
||||
</body> |
||||
</html> |
@ -0,0 +1,16 @@ |
||||
import { createApp } from 'vue' |
||||
import App from './App.vue' |
||||
|
||||
import router from './router' |
||||
|
||||
import '@/plugins/vant' |
||||
|
||||
const app = createApp(App) |
||||
|
||||
app.config.globalProperties.$$refs = {} |
||||
|
||||
// if (import.meta.env.DEV) {
|
||||
window.$$refs = app.config.globalProperties.$$refs |
||||
// }
|
||||
|
||||
app.use(router).mount('#app') |
@ -0,0 +1,15 @@ |
||||
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router' |
||||
|
||||
const routes: Array<RouteRecordRaw> = [ |
||||
{ |
||||
path: '/:pathMatch(.*)*', |
||||
component: () => import('./views/preview.vue') |
||||
} |
||||
] |
||||
|
||||
const router = createRouter({ |
||||
history: createWebHashHistory(), |
||||
routes |
||||
}) |
||||
|
||||
export default router |
@ -0,0 +1,27 @@ |
||||
import { defineComponent } from 'vue' |
||||
|
||||
export default defineComponent({ |
||||
name: 'CompRender', |
||||
props: { |
||||
element: { |
||||
type: Object, |
||||
default: () => ({}) |
||||
}, |
||||
config: { |
||||
type: Object, |
||||
default: () => ({}) |
||||
} |
||||
}, |
||||
setup(props) { |
||||
return () => { |
||||
const component = props.config.componentMap[props.element.componentKey] |
||||
return component.render({ |
||||
size: {}, |
||||
props: props.element.props || {}, |
||||
model: {}, |
||||
block: props.element, |
||||
custom: {} |
||||
}) |
||||
} |
||||
} |
||||
}) |
@ -0,0 +1,67 @@ |
||||
<template> |
||||
<template v-for="outItem in jsonData" :key="outItem._vid"> |
||||
<slot-item :element="outItem" :config="visualConfig" /> |
||||
</template> |
||||
</template> |
||||
|
||||
<script lang="tsx"> |
||||
import { defineComponent, PropType, reactive, toRefs } from 'vue' |
||||
import { visualConfig } from '@/visual.config' |
||||
import SlotItem from './slot-item.vue' |
||||
/** |
||||
* @name: preview |
||||
* @author: 卜启缘 |
||||
* @date: 2021/4/29 23:09 |
||||
* @description:preview |
||||
* @update: 2021/4/29 23:09 |
||||
*/ |
||||
export default defineComponent({ |
||||
name: 'Preview', |
||||
components: { |
||||
SlotItem |
||||
}, |
||||
emits: ['update:visible'], |
||||
setup(props) { |
||||
const state = reactive({ |
||||
jsonData: JSON.parse(sessionStorage.getItem('blocks') || '{}') |
||||
}) |
||||
|
||||
// 渲染组件 |
||||
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), |
||||
visualConfig, |
||||
renderCom |
||||
} |
||||
} |
||||
}) |
||||
</script> |
||||
|
||||
<style lang="scss"> |
||||
.h5-preview { |
||||
overflow: hidden; |
||||
.el-dialog__header { |
||||
display: none; |
||||
} |
||||
.simulator { |
||||
padding-right: 0; |
||||
&::-webkit-scrollbar { |
||||
width: 0; |
||||
} |
||||
} |
||||
} |
||||
</style> |
@ -1,31 +0,0 @@ |
||||
import { NumberRange } from './number-range' |
||||
import { VisualEditorComponent } from '@/visual-editor/visual-editor.utils' |
||||
|
||||
export default { |
||||
key: 'number-range', |
||||
moduleName: 'baseWidgets', |
||||
label: '数字范围输入框', |
||||
resize: { |
||||
width: true |
||||
}, |
||||
preview: () => <NumberRange style={{ width: '100%' }} />, |
||||
render: ({ model, size }) => { |
||||
return ( |
||||
<NumberRange |
||||
style={{ |
||||
width: size.width ? `${size.width}px` : null |
||||
}} |
||||
{...{ |
||||
start: model.start.value, |
||||
'onUpdate:start': model.start.onChange, |
||||
end: model.end.value, |
||||
'onUpdate:end': model.end.onChange |
||||
}} |
||||
/> |
||||
) |
||||
}, |
||||
model: { |
||||
start: '起始绑定字段', |
||||
end: '截止绑定字段' |
||||
} |
||||
} as VisualEditorComponent |
@ -1,24 +0,0 @@ |
||||
.number-range { |
||||
display: inline-flex; |
||||
width: 225px; |
||||
min-height: 40px; |
||||
align-items: stretch; |
||||
|
||||
& > div { |
||||
flex: 1; |
||||
|
||||
input { |
||||
width: 100%; |
||||
height: 100%; |
||||
margin: 0; |
||||
padding: 0; |
||||
box-sizing: border-box; |
||||
} |
||||
} |
||||
|
||||
span { |
||||
margin: 0 8px; |
||||
display: inline-flex; |
||||
align-items: center; |
||||
} |
||||
} |
@ -1,30 +0,0 @@ |
||||
import { defineComponent } from 'vue' |
||||
import { useVModel } from '@vueuse/core' |
||||
import './number-range.scss' |
||||
|
||||
export const NumberRange = defineComponent({ |
||||
props: { |
||||
start: { type: String }, |
||||
end: { type: String } |
||||
}, |
||||
emits: { |
||||
'update:start': (_?: string) => true, |
||||
'update:end': (_?: string) => true |
||||
}, |
||||
setup(props) { |
||||
const startModel = useVModel(props, 'start') |
||||
const endModel = useVModel(props, 'end') |
||||
|
||||
return () => ( |
||||
<div class="number-range"> |
||||
<div> |
||||
<input type="text" v-model={startModel.value} /> |
||||
</div> |
||||
<span>~</span> |
||||
<div> |
||||
<input type="text" v-model={endModel.value} /> |
||||
</div> |
||||
</div> |
||||
) |
||||
} |
||||
}) |
@ -1,37 +0,0 @@ |
||||
import { ElOption, ElSelect } from 'element-plus' |
||||
import { createEditorTableProp } from '@/visual-editor/visual-editor.props' |
||||
import { VisualEditorComponent } from '@/visual-editor/visual-editor.utils' |
||||
|
||||
export default { |
||||
key: 'select', |
||||
moduleName: 'baseWidgets', |
||||
label: '下拉框', |
||||
preview: () => <ElSelect />, |
||||
render: ({ props, model, custom }) => ( |
||||
<ElSelect |
||||
{...custom} |
||||
key={(props.options || []).map((opt: any) => opt.value).join(',')} |
||||
{...model.default} |
||||
> |
||||
{(props.options || []).map((opt: { label: string; value: string }, index: number) => ( |
||||
<ElOption label={opt.label} value={opt.value} key={index} /> |
||||
))} |
||||
</ElSelect> |
||||
), |
||||
props: { |
||||
options: createEditorTableProp({ |
||||
label: '下拉选项', |
||||
option: { |
||||
options: [ |
||||
{ label: '显示值', field: 'label' }, |
||||
{ label: '绑定值', field: 'value' }, |
||||
{ label: '备注', field: 'comments' } |
||||
], |
||||
showKey: 'label' |
||||
} |
||||
}) |
||||
}, |
||||
model: { |
||||
default: '绑定字段' |
||||
} |
||||
} as VisualEditorComponent |
@ -0,0 +1,8 @@ |
||||
/** |
||||
* @name: index |
||||
* @author: 卜启缘 |
||||
* @date: 2021/5/6 0:04 |
||||
* @description:index |
||||
* @update: 2021/5/6 0:04 |
||||
*/ |
||||
export const BASE_URL = import.meta.env.BASE_URL |
Loading…
Reference in new issue