Skip to content
 

form 表单嵌套 table 表格

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


下面是日常项目中 form 表单嵌套 table 表格的场景。同时也添加了表单项的校验规则。

截图如下:

1,template 模板部分如下:

javascript
 <el-form>
      {/* 其他表单项 */}
      <el-form-item label="病症详情" prop="conditionDetails">
          <el-input v-model="formData.conditionDetails" placeholder="请输入病症详情" maxlength="20" />
        </el-form-item>

      {/* 嵌套项 */}
        <div class="table-content">
          <p class="star">医疗检查</p>
          <el-table :data="formData.medicalExaminationList" style="width: 90%; margin-left: auto" border>
            <el-table-column prop="k1" label="检查项" align="center">
              <template #default="scope">
                <el-form-item :required="true" :prop="'medicalExaminationList.' + scope.$index + '.k1'" :rules="formRules.k1">
                  <el-input v-model="scope.row.k1" />
                </el-form-item>
              </template>
            </el-table-column>
            <el-table-column prop="v1" label="检查结果" align="center">
              <template #default="scope">
                <el-form-item :required="true" :prop="'medicalExaminationList.' + scope.$index + '.v1'" :rules="formRules.v1">
                  <el-input v-model="scope.row.v1" />
                </el-form-item>
              </template>
            </el-table-column>
            <el-table-column label="操作" align="center" width="120px">
              <template #default="scope">
                <div style="display: flex; gap: 10px; justify-content: center">
                  <span class="tag" @click="copy">添加</span>
                  <span class="tag" v-if="scope.$index !== 0" @click="del(scope.$index)" style="color: red">删除</span>
                </div>
              </template>
            </el-table-column>
          </el-table>
        </div>
      </el-form>

2,ts 主要代码如下:

javascript
/** 绑定的一定是一个数组 */
const formData = {
  medicalExaminationList: [
    {
      k1: "",
      v1: ""
    }
  ]
};

/** 校验规则 */
const formRules = reactive({
  conditionDetails: [{ required: true, message: "病症详情不能为空", trigger: "change" }],
  k1: [{ required: true, message: "检查项不能为空", trigger: "change" }],
  v1: [{ required: true, message: "检查结果不能为空", trigger: "change" }]
});

/** 复制 */
function copy() {
  if (formData.value.medicalExaminationList.length >= 5) {
    return message.warning("最多只能录入5项");
  }
  formData.value.medicalExaminationList.push({
    k1: "",
    v1: ""
  });
}
/** 删除 */
function del(id: number) {
  if (formData.value.medicalExaminationList.length === 1) return message.warning("至少录入一项医疗检查");
  formData.value.medicalExaminationList.splice(id, 1);
}

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