ProForm.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <script setup lang="ts">
  2. import type { PropType } from 'vue'
  3. import type { BasicForm, BasicFormItem, AdvancedForm, AdvancedFormItem } from '@/types/form'
  4. import { ElMessage } from 'element-plus'
  5. const props = defineProps({
  6. formData: {
  7. required: true,
  8. type: Object
  9. },
  10. formConfig: {
  11. required: true,
  12. type: Object as PropType<BasicForm | AdvancedForm>
  13. },
  14. create: {
  15. required: true,
  16. type: Function
  17. },
  18. update: {
  19. required: true,
  20. type: Function
  21. },
  22. advanced: Boolean
  23. })
  24. const formProps: any = ref({
  25. labelWidth: '100px',
  26. labelPosition: 'top',
  27. size: 'large',
  28. ...props.formConfig?.props
  29. })
  30. const formInitData = computed(() => {
  31. return props.formData
  32. })
  33. const formRef = ref()
  34. const submit = async () => {
  35. let message
  36. return formRef.value.validate().then(async (valid: boolean) => {
  37. try {
  38. if (formInitData.value.id) {
  39. await props.update(formInitData.value)
  40. message = '编辑成功'
  41. } else {
  42. await props.create(formInitData.value)
  43. message = '新增成功'
  44. }
  45. ElMessage({
  46. type: 'success',
  47. message
  48. })
  49. return true
  50. } catch (error) {
  51. return false
  52. }
  53. })
  54. }
  55. defineExpose({
  56. submit
  57. })
  58. </script>
  59. <template>
  60. <el-form :model="formInitData" ref="formRef" v-bind="formProps" class="form">
  61. <advanced-form :formConfig="formConfig" :formData="formInitData" v-if="advanced" />
  62. <basic-form :formConfig="formConfig" :formData="formInitData" v-else />
  63. </el-form>
  64. </template>
  65. <style lang="scss" scoped>
  66. :deep(.el-select) {
  67. width: 100%;
  68. }
  69. </style>