Vue3 重构:REVIEW 表单构建
							parent
							
								
									2abc7eca67
								
							
						
					
					
						commit
						7463eea243
					
				| 
						 | 
				
			
			@ -3,89 +3,71 @@
 | 
			
		|||
    <el-row>
 | 
			
		||||
      <el-col>
 | 
			
		||||
        <div class="mb-2 float-right">
 | 
			
		||||
          <el-button size="small" @click="setJson"> 导入JSON</el-button>
 | 
			
		||||
          <el-button size="small" @click="setOption"> 导入Options</el-button>
 | 
			
		||||
          <el-button size="small" type="primary" @click="showJson">生成 JSON</el-button>
 | 
			
		||||
          <el-button size="small" type="success" @click="showOption">生成O ptions</el-button>
 | 
			
		||||
          <el-button size="small" type="danger" @click="showTemplate">生成组件</el-button>
 | 
			
		||||
          <!-- <el-button size="small" @click="changeLocale">中英切换</el-button> -->
 | 
			
		||||
        </div>
 | 
			
		||||
      </el-col>
 | 
			
		||||
      <!-- 表单设计器 -->
 | 
			
		||||
      <el-col>
 | 
			
		||||
        <fc-designer ref="designer" height="780px" />
 | 
			
		||||
      </el-col>
 | 
			
		||||
    </el-row>
 | 
			
		||||
    <Dialog :title="dialogTitle" v-model="dialogVisible" maxHeight="600">
 | 
			
		||||
  </ContentWrap>
 | 
			
		||||
 | 
			
		||||
  <!-- 弹窗:表单预览 -->
 | 
			
		||||
  <Dialog :title="dialogTitle" v-model="dialogVisible" max-height="600">
 | 
			
		||||
    <div ref="editor" v-if="dialogVisible">
 | 
			
		||||
        <XTextButton style="float: right" :title="t('common.copy')" @click="copy(formValue)" />
 | 
			
		||||
      <el-button style="float: right" @click="copy(formData)">
 | 
			
		||||
        {{ t('common.copy') }}
 | 
			
		||||
      </el-button>
 | 
			
		||||
      <el-scrollbar height="580">
 | 
			
		||||
        <div v-highlight>
 | 
			
		||||
          <code class="hljs">
 | 
			
		||||
              {{ formValue }}
 | 
			
		||||
            {{ formData }}
 | 
			
		||||
          </code>
 | 
			
		||||
        </div>
 | 
			
		||||
      </el-scrollbar>
 | 
			
		||||
    </div>
 | 
			
		||||
      <span style="color: red" v-if="err">输入内容格式有误!</span>
 | 
			
		||||
  </Dialog>
 | 
			
		||||
  </ContentWrap>
 | 
			
		||||
</template>
 | 
			
		||||
<script setup lang="ts" name="Build">
 | 
			
		||||
import formCreate from '@form-create/element-ui'
 | 
			
		||||
import { useClipboard } from '@vueuse/core'
 | 
			
		||||
const { t } = useI18n() // 国际化
 | 
			
		||||
const message = useMessage() // 消息
 | 
			
		||||
 | 
			
		||||
const { t } = useI18n()
 | 
			
		||||
const message = useMessage()
 | 
			
		||||
 | 
			
		||||
const designer = ref()
 | 
			
		||||
 | 
			
		||||
const dialogVisible = ref(false)
 | 
			
		||||
const dialogTitle = ref('')
 | 
			
		||||
const err = ref(false)
 | 
			
		||||
const type = ref(-1)
 | 
			
		||||
const formValue = ref('')
 | 
			
		||||
const designer = ref() // 表单设计器
 | 
			
		||||
const dialogVisible = ref(false) // 弹窗的是否展示
 | 
			
		||||
const dialogTitle = ref('') // 弹窗的标题
 | 
			
		||||
const formType = ref(-1) // 表单的类型:0 - 生成 JSON;1 - 生成 Options;2 - 生成组件
 | 
			
		||||
const formData = ref('') // 表单数据
 | 
			
		||||
 | 
			
		||||
/** 打开弹窗 */
 | 
			
		||||
const openModel = (title: string) => {
 | 
			
		||||
  dialogVisible.value = true
 | 
			
		||||
  dialogTitle.value = title
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const setJson = () => {
 | 
			
		||||
  openModel('导入JSON--未实现')
 | 
			
		||||
}
 | 
			
		||||
const setOption = () => {
 | 
			
		||||
  openModel('导入Options--未实现')
 | 
			
		||||
}
 | 
			
		||||
/** 生成 JSON */
 | 
			
		||||
const showJson = () => {
 | 
			
		||||
  openModel('生成 JSON')
 | 
			
		||||
  type.value = 0
 | 
			
		||||
  formValue.value = designer.value.getRule()
 | 
			
		||||
  formType.value = 0
 | 
			
		||||
  formData.value = designer.value.getRule()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 生成 Options */
 | 
			
		||||
const showOption = () => {
 | 
			
		||||
  openModel('生成 Options')
 | 
			
		||||
  type.value = 1
 | 
			
		||||
  formValue.value = designer.value.getOption()
 | 
			
		||||
  formType.value = 1
 | 
			
		||||
  formData.value = designer.value.getOption()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 生成组件 */
 | 
			
		||||
const showTemplate = () => {
 | 
			
		||||
  openModel('生成组件')
 | 
			
		||||
  type.value = 2
 | 
			
		||||
  formValue.value = makeTemplate()
 | 
			
		||||
}
 | 
			
		||||
// const changeLocale = () => {
 | 
			
		||||
//   console.info('changeLocale')
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
/** 复制 **/
 | 
			
		||||
const copy = async (text: string) => {
 | 
			
		||||
  const { copy, copied, isSupported } = useClipboard({ source: text })
 | 
			
		||||
  if (!isSupported) {
 | 
			
		||||
    message.error(t('common.copyError'))
 | 
			
		||||
  } else {
 | 
			
		||||
    await copy()
 | 
			
		||||
    if (unref(copied)) {
 | 
			
		||||
      message.success(t('common.copySuccess'))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  formType.value = 2
 | 
			
		||||
  formData.value = makeTemplate()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const makeTemplate = () => {
 | 
			
		||||
| 
						 | 
				
			
			@ -114,4 +96,17 @@ const makeTemplate = () => {
 | 
			
		|||
    init()
 | 
			
		||||
  <\/script>`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** 复制 **/
 | 
			
		||||
const copy = async (text: string) => {
 | 
			
		||||
  const { copy, copied, isSupported } = useClipboard({ source: text })
 | 
			
		||||
  if (!isSupported) {
 | 
			
		||||
    message.error(t('common.copyError'))
 | 
			
		||||
  } else {
 | 
			
		||||
    await copy()
 | 
			
		||||
    if (unref(copied)) {
 | 
			
		||||
      message.success(t('common.copySuccess'))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue