JinZHouXiYiJi_DaPin2/docs/RenderComponent.vue

81 lines
2.3 KiB
Vue

<template>
<n-card v-if="mode === 'debug'" :title="title" style="margin-bottom: 16px; height: 100%">
<n-tabs type="line" animated>
<n-tab-pane name="oasis" tab="效果" display-directive="show">
<Render />
</n-tab-pane>
<n-tab-pane name="attr" tab="属性" display-directive="show">
<OCodeEditor
v-model:value="form.propValue"
class="content"
mode="debug"
height="300px"
@update:value="propValueChange"
/>
</n-tab-pane>
<n-tab-pane name="style" tab="样式" display-directive="show">
<OCodeEditor
v-model:value="form.style"
class="content"
mode="debug"
height="300px"
@update:value="styleChange"
/>
</n-tab-pane>
</n-tabs>
</n-card>
<n-card v-else :title="title" style="margin-bottom: 16px; height: 100%">
<Render />
</n-card>
</template>
<script setup lang="ts">
import { NCard, NTabPane, NTabs } from 'naive-ui'
import type { CustomComponent } from 'open-data-v/base'
import { getComponentStyle, uuid } from 'open-data-v/designer/utils'
import type { ComponentOptions, ConcreteComponent } from 'vue'
import { computed, h, reactive } from 'vue'
const props = withDefaults(
defineProps<{
config: new (id?: string, name?: string) => CustomComponent
component: ConcreteComponent
propValue: Record<string, any>
style: Record<string, any>
title: string
mode?: 'view' | 'debug' | 'use'
}>(),
{
mode: 'debug'
}
)
const form = reactive<{
propValue: string
style: string
}>({
propValue: JSON.stringify(props.propValue, null, '\t'),
style: JSON.stringify(props.style, null, '\t')
})
const propValueChange = (value: string) => {
form.propValue = value
}
const styleChange = (style: string) => {
form.style = style
}
const Render = computed<ComponentOptions>(() => {
const componentInstance = new props.config(uuid())
const style = JSON.parse(form.style)
const propValue = JSON.parse(form.propValue)
componentInstance.setStyleValue({ style: style })
componentInstance.setPropValue({ propValue: propValue })
return h(props.component, {
id: componentInstance.id,
key: componentInstance.id,
class: 'component',
style: getComponentStyle(componentInstance),
component: componentInstance
})
})
</script>