riku
2025-09-16 5ad61d6ad3a0ce12c7fe0808527069b09a7c9c0d
src/components/form/FYForm.vue
@@ -9,10 +9,16 @@
  >
    <slot name="form-item" :formObj="formObj"></slot>
    <el-form-item v-if="showButtons">
      <el-button :disabled="!edit" type="primary" @click="onSubmit" :loading="loading"
        >提交</el-button
      <el-button
        :disabled="!edit"
        type="primary"
        @click="onSubmit"
        :loading="loading"
        >{{ submitName }}</el-button
      >
      <el-button v-if="useReset" :disabled="!edit" @click="onReset">重置</el-button>
      <el-button v-if="useReset" :disabled="!edit" @click="onReset"
        >重置</el-button
      >
      <el-button v-if="useCancel" @click="onCancel">取消</el-button>
    </el-form-item>
  </el-form>
@@ -26,17 +32,34 @@
 * 可传入初始表单数据formInfo,表单校验规则rules
 * 实现submit和cancel触发函数
 */
import { defineProps, defineEmits, reactive, ref, watch, computed } from 'vue';
import {
  defineProps,
  defineEmits,
  reactive,
  ref,
  watch,
  computed,
  defineExpose
} from 'vue';
import { useFormConfirm } from '@/composables/formConfirm';
const props = defineProps({
  //表单基本信息
  formInfo: Object,
  formInfo: {
    type: Object,
    default: () => {
      return {};
    }
  },
  //表单检验规则
  rules: Object,
  showButtons: {
    type: Boolean,
    default: true
  },
  submitName: {
    type: String,
    default: '提交'
  },
  //取消按钮是否可用
  useCancel: Boolean,
@@ -62,8 +85,8 @@
  _locations: [
    {
      required: true,
      message: '省/市/区/镇不能为空',
      trigger: 'change',
      message: '行政区划不能为空',
      trigger: 'change'
    }
  ],
  _scenetype: [
@@ -76,14 +99,15 @@
});
//表单操作函数
const { formObj, formRef, edit, onSubmit, onCancel, onReset, clear } = useFormConfirm({
  submit: {
    do: submit
  },
  cancel: {
    do: cancel
  }
});
const { formObj, formRef, edit, onSubmit, onCancel, onReset, clear } =
  useFormConfirm({
    submit: {
      do: submit
    },
    cancel: {
      do: cancel
    }
  });
//加载状态
const loading = ref(false);
@@ -92,14 +116,17 @@
function submit() {
  loading.value = true;
  return new Promise((resolve, reject) => {
    emit('submit', formObj, () => {
      loading.value = false;
      resolve();
    },(err)=>{
      loading.value = false;
      reject(err);
    });
  });
    emit(
      'submit',
      formObj,
      () => {
        resolve();
      },
      (err) => {
        reject(err ? err : '');
      }
    );
  }).finally(() => (loading.value = false));
}
//取消按钮触发
@@ -107,9 +134,9 @@
  emit('cancel');
}
const allRules = computed(()=>{
  return {...baseRules, ...props.rules}
})
const allRules = computed(() => {
  return { ...baseRules, ...props.rules };
});
//监听表单初始数据传入
watch(
@@ -131,9 +158,22 @@
);
//监听表单编辑状态
watch(edit, (nValue) => {
  emit('update:isEdit', nValue);
watch(
  () => props.isEdit,
  (nV, oV) => {
    if (nV != oV) {
      edit.value = nV;
    }
  },
  { immediate: true }
);
watch(edit, (nV, oV) => {
  if (nV != oV) {
    emit('update:isEdit', nV);
  }
});
defineExpose({ formObj, onSubmit, onCancel, onReset });
</script>
<style scoped></style>