communityDetail.vue 4.38 KB
<script setup lang="ts">
import { reactive, ref, onMounted, getCurrentInstance,defineExpose } from "vue";
import type { ElForm } from "element-plus";
import { addOrUpdate } from "@/api/community/residence.ts";

const ruleFormRef = ref<InstanceType<typeof ElForm>>();
let instance: ComponentInternalInstance | null = getCurrentInstance(); //获取app实例
// 声明props
const props = defineProps({
  formObj: {
    type: Object,
    default: {
      name: null,
      address: null,
      locality: null,
      buildingCount: null,
      storeroomCount: null,
      truckSpaceCount: null,
    },
  },
});

let loading = ref(false);

// 表单验证
const rules = reactive({
  name: [
    {
      required: true,
      message: "请输入小区名",
      trigger: "blur",
    },
    { whitespace: true, message: "请输入正确的信息", trigger: "blur" },
  ],
  locality: [
    {
      required: true,
      message: "请输入所在地区",
      trigger: "blur",
    },
    { whitespace: true, message: "请输入正确的信息", trigger: "blur" },
  ],
  address: [
    {
      required: true,
      message: "请输入地址",
      trigger: "blur",
    },
    { whitespace: true, message: "请输入正确的信息", trigger: "blur" },
  ],
  buildingCount: [
    {
      required: true,
      message: "请输入楼座数",
      trigger: "blur",
    },
    { type: "number", message: "请输入正确数值,最大值不能超过5000", max: 5000,min:1 },
  ],
  storeroomCount: [
    {
      required: false,
      message: "请输入储藏室数",
      trigger: "blur",
    },
    { type: "number", message: "请输入正确数值,最大值不能超过5000", max: 5000,min:1 },
  ],
  truckSpaceCount: [
    {
      required: false,
      message: "请输入车位数",
      trigger: "blur",
    },
    { type: "number", message: "请输入正确数值,最大值不能超过5000", max: 5000,min:1 },
  ],
});

const emit = defineEmits<{
  (e: "cancel"): void;
  (e: "success"): void;
}>();

/**
 * 表单提交
 * @param {ElForm | undefined} formEl 表单对象
 */
let submitForm = (formEl: InstanceType<typeof ElForm> | undefined) => {
  loading.value = true;
  if (!formEl) return;
  formEl.validate((valid) => {
    if (valid) {
      addOrUpdate(props.formObj)
        .then((res) => {
          loading.value = false;
          emit("success");
        })
        .catch((err) => {
          loading.value = false;
        });
    } else {
      instance?.proxy?.$message.error("请完善信息"); //调用
      loading.value = false;
      return false;
    }
  });
};
/**
 * 重置
 */
let resetForm = () => {
  ruleFormRef.value.resetFields();
};
/**
 * 取消提交
 */
const cancel: void = () => {
  emit("cancel");
};

defineExpose({
  resetForm,
});
</script>

<template>
  <el-form
    ref="ruleFormRef"
    :model="props.formObj"
    :rules="rules"
    label-width="100px"
  >
    <el-form-item label="小区名称:" prop="name">
      <el-input
        v-model="props.formObj.name"
        placeholder="请输入名称"
        :disabled="!!props.formObj.id"
        maxlength="30"
      ></el-input>
    </el-form-item>
    <el-form-item label="所在地区:" prop="locality">
      <el-input
        v-model="props.formObj.locality"
        placeholder="请输入所在地区"
        maxlength="30"
      ></el-input>
    </el-form-item>
    <el-form-item label="详细地址:" prop="address">
      <el-input
        v-model="props.formObj.address"
        placeholder="请输入详细地址"
        maxlength="50"
      ></el-input>
    </el-form-item>
    <el-form-item label="楼座数:" prop="buildingCount">
      <el-input
        v-model.number="props.formObj.buildingCount"
        placeholder="请输入楼座数"
      ></el-input>
    </el-form-item>
    <el-form-item label="储藏室数:" prop="storeroomCount">
      <el-input
        v-model.number="props.formObj.storeroomCount"
        placeholder="请输入储藏室数"
      ></el-input>
    </el-form-item>
    <el-form-item label="车位数:" prop="truckSpaceCount">
      <el-input
        v-model.number="props.formObj.truckSpaceCount"
        placeholder="请输入车位数"
      ></el-input>
    </el-form-item>
    <el-form-item>
      <el-button
        type="primary"
        @click="submitForm(ruleFormRef)"
        :loading="loading"
        >保存</el-button
      >
      <el-button @click="cancel">取消</el-button>
    </el-form-item>
  </el-form>
</template>