Skip to content
 

单选框的选择动态切换不同的 form 表单

更新: 9/4/2025字数: 0 字 时长: 0 分钟


需求:

点击单选框,切换不同的 form 表单测试项,不是暴力的显示隐藏,而是通过数据绑定,切换不同的 form 表单;

这也是 vue 的核心思想,以数据驱动视图

实现的效果图如下: 图一:

图二:

1,template 部分:

html
<div class="content" v-if="formType === 'create'">
  <el-form-item label="体测项目:" prop="assessmentProject">
    <el-radio-group v-model="formData.assessmentProject" @change="updateRadio">
      <el-radio v-for="dict in getIntDictOptions(DICT_TYPE.PHYSICAL_ASSESSMENT_PROJECT)" :key="dict.value" :value="dict.value">
        {{ dict.label }}
      </el-radio>
    </el-radio-group>
  </el-form-item>
  <!-- 显示的表单  -->
  <el-form ref="formRef" :model="physicalTestingProject" :rules="formRules" label-width="140px" v-loading="formLoading">
    <el-form-item v-for="(field, index) in currentFormFields" :key="index" :label="field.label" :prop="field.value" :rules="field.rules">
      <el-input v-model="physicalTestingProject[field.value]" @input="(value) => onlyInputNumber(value, field.value)" />
    </el-form-item>
  </el-form>
</div>

2,ts 部分:

js
// 定义枚举值
const formTypes = reactive({
  typeMap: {
    1: "harvardStepTestVO",
    2: "powerCarTestVO",
    3: "pwc170TestVO"
  },
  typeMapText: {
    1: "哈佛台阶测试",
    2: "功率车测试",
    3: "PWC170测试"
  }
});

const physicalTestingProject = ref({}); // 表单数据
const selectedTestType = ref("harvardStepTestVO"); // 当前选中的体测项目

const formData =
  ref <
  CreatePhysicalAssessmentRecordReqVO >
  {
    assessmentProject: 1, // 体测项目
    patientId: null // 患者编号
  };

// 获取当前渲染的表单结构
const currentFormFields = computed(() => {
  return formStructure[selectedTestType.value];
});

/** 选择的体测项目 并清空之前的填写 - 选中单选框处方 */
const updateRadio = (e: number) => {
  physicalTestingProject.value = {};
  selectedTestType.value = formTypes.typeMap[e];
};

// 所有的表单项
const formStructure = {
  // 哈佛台阶测试 1
  harvardStepTestVO: [
    {
      label: "运动时间",
      value: "exerciseTime",
      rules: [{ required: true, message: "请输入运动时间", trigger: "blur" }]
    },
    {
      label: "第一次脉搏数据",
      value: "firstPulse",
      rules: [{ required: true, message: "请输入第一次脉搏数据", trigger: "blur" }]
    },
    {
      label: "第二次脉搏数据",
      value: "secondPulse",
      rules: [{ required: true, message: "请输入第二次脉搏数据", trigger: "blur" }]
    },
    {
      label: "第三次脉搏数据",
      value: "thirdPulse",
      rules: [{ required: true, message: "请输入第三次脉搏数据", trigger: "blur" }]
    }
  ],
  // 功率车测试 2
  powerCarTestVO: [
    {
      label: "靶心率",
      value: "pedalingRate",
      rules: [{ required: true, message: "请输入靶心率", trigger: "blur" }]
    },
    {
      label: "负荷功率",
      value: "loadPower",
      rules: [{ required: true, message: "请输入负荷功率", trigger: "blur" }]
    }
  ],
  // PWC170测试 pwc170TestVO 3
  pwc170TestVO: [
    {
      label: "第一次负荷功率",
      value: "firstLoadPower",
      rules: [{ required: true, message: "请输入第一次负荷功率", trigger: "blur" }]
    },
    {
      label: "第一次负荷后心率",
      value: "firstLoadPulseRate",
      rules: [{ required: true, message: "请输入第一次负荷后心率", trigger: "blur" }]
    },
    {
      label: "第二次负荷功率",
      value: "secondLoadPower",
      rules: [{ required: true, message: "请输入第二次负荷功率", trigger: "blur" }]
    },
    {
      label: "第二次负荷后心率",
      value: "secondLoadPulseRate",
      rules: [{ required: true, message: "请输入第二次负荷后心率", trigger: "blur" }]
    }
  ]
};

/** 只能输入数字 */
function onlyInputNumber(value, value2) {
  physicalTestingProject.value[value2] = value.replace(/\D/g, "");
}

我见青山多妩媚,料青山见我应如是。