Vue3 重构:REVIEW 表单构建

This commit is contained in:
YunaiV 2023-03-25 16:22:43 +08:00
parent 2abc7eca67
commit 7463eea243

View File

@ -3,77 +3,99 @@
<el-row> <el-row>
<el-col> <el-col>
<div class="mb-2 float-right"> <div class="mb-2 float-right">
<el-button size="small" @click="setJson"> 导入JSON</el-button> <el-button size="small" type="primary" @click="showJson">生成 JSON</el-button>
<el-button size="small" @click="setOption"> 导入Options</el-button> <el-button size="small" type="success" @click="showOption">生成O ptions</el-button>
<el-button size="small" type="primary" @click="showJson">生成JSON</el-button>
<el-button size="small" type="success" @click="showOption">生成Options</el-button>
<el-button size="small" type="danger" @click="showTemplate">生成组件</el-button> <el-button size="small" type="danger" @click="showTemplate">生成组件</el-button>
<!-- <el-button size="small" @click="changeLocale">中英切换</el-button> -->
</div> </div>
</el-col> </el-col>
<!-- 表单设计器 -->
<el-col> <el-col>
<fc-designer ref="designer" height="780px" /> <fc-designer ref="designer" height="780px" />
</el-col> </el-col>
</el-row> </el-row>
<Dialog :title="dialogTitle" v-model="dialogVisible" maxHeight="600">
<div ref="editor" v-if="dialogVisible">
<XTextButton style="float: right" :title="t('common.copy')" @click="copy(formValue)" />
<el-scrollbar height="580">
<div v-highlight>
<code class="hljs">
{{ formValue }}
</code>
</div>
</el-scrollbar>
</div>
<span style="color: red" v-if="err">输入内容格式有误!</span>
</Dialog>
</ContentWrap> </ContentWrap>
<!-- 弹窗表单预览 -->
<Dialog :title="dialogTitle" v-model="dialogVisible" max-height="600">
<div ref="editor" v-if="dialogVisible">
<el-button style="float: right" @click="copy(formData)">
{{ t('common.copy') }}
</el-button>
<el-scrollbar height="580">
<div v-highlight>
<code class="hljs">
{{ formData }}
</code>
</div>
</el-scrollbar>
</div>
</Dialog>
</template> </template>
<script setup lang="ts" name="Build"> <script setup lang="ts" name="Build">
import formCreate from '@form-create/element-ui' import formCreate from '@form-create/element-ui'
import { useClipboard } from '@vueuse/core' import { useClipboard } from '@vueuse/core'
const { t } = useI18n() //
const message = useMessage() //
const { t } = useI18n() const designer = ref() //
const message = useMessage() const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const designer = ref() const formType = ref(-1) // 0 - JSON1 - Options2 -
const formData = ref('') //
const dialogVisible = ref(false)
const dialogTitle = ref('')
const err = ref(false)
const type = ref(-1)
const formValue = ref('')
/** 打开弹窗 */
const openModel = (title: string) => { const openModel = (title: string) => {
dialogVisible.value = true dialogVisible.value = true
dialogTitle.value = title dialogTitle.value = title
} }
const setJson = () => { /** 生成 JSON */
openModel('导入JSON--未实现')
}
const setOption = () => {
openModel('导入Options--未实现')
}
const showJson = () => { const showJson = () => {
openModel('生成JSON') openModel('生成 JSON')
type.value = 0 formType.value = 0
formValue.value = designer.value.getRule() formData.value = designer.value.getRule()
} }
/** 生成 Options */
const showOption = () => { const showOption = () => {
openModel('生成Options') openModel('生成 Options')
type.value = 1 formType.value = 1
formValue.value = designer.value.getOption() formData.value = designer.value.getOption()
} }
/** 生成组件 */
const showTemplate = () => { const showTemplate = () => {
openModel('生成组件') openModel('生成组件')
type.value = 2 formType.value = 2
formValue.value = makeTemplate() formData.value = makeTemplate()
}
const makeTemplate = () => {
const rule = designer.value.getRule()
const opt = designer.value.getOption()
return `<template>
<form-create
v-model="fapi"
:rule="rule"
:option="option"
@submit="onSubmit"
></form-create>
</template>
<script setup lang=ts>
import formCreate from "@form-create/element-ui";
const faps = ref(null)
const rule = ref('')
const option = ref('')
const init = () => {
rule.value = formCreate.parseJson('${formCreate.toJson(rule).replaceAll('\\', '\\\\')}')
option.value = formCreate.parseJson('${JSON.stringify(opt)}')
}
const onSubmit = (formData) => {
//todo
}
init()
<\/script>`
} }
// const changeLocale = () => {
// console.info('changeLocale')
// }
/** 复制 **/ /** 复制 **/
const copy = async (text: string) => { const copy = async (text: string) => {
@ -87,31 +109,4 @@ const copy = async (text: string) => {
} }
} }
} }
const makeTemplate = () => {
const rule = designer.value.getRule()
const opt = designer.value.getOption()
return `<template>
<form-create
v-model="fapi"
:rule="rule"
:option="option"
@submit="onSubmit"
></form-create>
</template>
<script setup lang=ts>
import formCreate from "@form-create/element-ui";
const faps = ref(null)
const rule = ref('')
const option = ref('')
const init = () => {
rule.value = formCreate.parseJson('${formCreate.toJson(rule).replaceAll('\\', '\\\\')}')
option.value = formCreate.parseJson('${JSON.stringify(opt)}')
}
const onSubmit = (formData) => {
//todo
}
init()
<\/script>`
}
</script> </script>