123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- <template>
- <el-dialog
- v-model="dialogVisible"
- :close-on-click-modal="false"
- :title="parameter.title"
- :destroy-on-close="true"
- :width="parameter.width"
- :top="parameter.top"
- draggable
- >
- <ProFrom ref="proFormRef" :items-options="itemsOptions" :form-options="_options" :model="model" />
- <template #footer>
- <span class="dialog-footer">
- <el-button type="primary" v-if="parameter.isEdit" :loading="butLoading" @click="handleSubmit">确认</el-button>
- <el-button @click="handleCancel">取消</el-button>
- </span>
- </template>
- </el-dialog>
- </template>
- <script setup lang="ts" name="FormDialog">
- import { ref, ComputedRef, computed } from 'vue'
- import ProFrom from '@/components/ProForm/index.vue'
- import { ElMessage } from 'element-plus'
- export interface DialogParameterProps {
- title: string // 标题
- width?: number // 弹框宽度
- labelWidth?: number // label宽度
- api?: (params: any) => Promise<any> // 表单提交api
- isEdit?: boolean // 是否编辑
- top?: string // 离顶部距离
- getTableList?: () => void // 获取表格数据的Api
- }
- export interface FormParameterProps {
- formOptions?: ProForm.FormOptions // 表单配置
- itemsOptions: ProForm.ItemsOptions[] // 动态表单字段配置
- model?: Record<ProForm.FormItem['prop'], ProForm.FormItem['value']> // 表单数据对象
- }
- const props = withDefaults(defineProps<FormParameterProps>(), {
- formOptions: () => {
- return {}
- },
- itemsOptions: () => [],
- model: () => {
- return {}
- }
- })
- // 父组件传过来的参数
- const parameter = ref<DialogParameterProps>({
- title: '',
- width: 500,
- top: '10vh',
- isEdit: true
- })
- // dialog状态
- const dialogVisible = ref(false)
- const butLoading = ref(false)
- const _options: ComputedRef<ProForm.FormOptions> = computed(() => {
- const form = {
- labelWidth: 120,
- hasFooter: false,
- disabled: false
- }
- return Object.assign(form, props.formOptions)
- })
- const proFormRef = ref<InstanceType<typeof ProFrom> | null>(null)
- // 表单提交校验
- const handleSubmit = () => {
- const formEl = proFormRef.value?.proFormRef
- const formModel = proFormRef.value?.formModel
- butLoading.value = true
- if (!formEl) return
- formEl.validate(valid => {
- if (valid) {
- parameter.value.api!(Object.assign({ ...props.model }, { ...formModel })).then(res => {
- if (res.code == 200) {
- proFormRef.value?.resetForm(formEl)
- ElMessage.success('操作成功')
- dialogVisible.value = false
- parameter.value.getTableList && parameter.value.getTableList()
- } else {
- console.log('message', res.message)
- }
- })
- butLoading.value = false
- }
- butLoading.value = false
- })
- }
- // 取消按钮,重置表单,关闭弹框
- const handleCancel = () => {
- const formEl = proFormRef.value?.proFormRef
- if (!formEl) return
- proFormRef.value?.resetForm(formEl)
- butLoading.value = false
- dialogVisible.value = false
- }
- // 接收父组件参数
- const openDialog = (params: DialogParameterProps) => {
- parameter.value = { ...parameter.value, ...params }
- _options.value.disabled = !parameter.value.isEdit
- butLoading.value = false
- dialogVisible.value = true
- }
- defineExpose({
- openDialog
- })
- </script>
|