【Vue】Element表单做成表格样式,el-form修改表格样式

本文描述了一个使用Vue.js和ElementUI构建的党内职务基本信息表单,包含姓名、性别、出生日期等个人信息,以及任职时间、联系方式、组织信息等,支持编辑和保存操作。

<el-dialog
        width="55%"
        top="5vh"
        :title="textMap[dialogStatus]"
        :visible.sync="dialogFormVisible"
        :close-on-click-modal="false"
        destroy-on-close
        @open="dialogOpen"
        @close="resetTemp"
      >
        <h2 style="margin: 0 auto; text-align: center">党内职务基本信息表</h2>
        <el-form
          ref="dataForm"
          v-loading="dialogLoading"
          :rules="rules"
          :model="temp"
          label-position="right"
          label-width="111px"
          class="dataForm"
        >
          <el-row>
            <el-row>
              <el-col :span="20">
                <el-row>
                  <el-col :span="8">
                    <el-form-item label="姓名" prop="memberId" class="formItemDuty" style="border-top: 0px;">
                      <perSelector :per-selector="temp.perSelector" :edit-visible="dialogStatus === 'detail' || dialogStatus === 'update'" class="formItemDutyIn" @handleConfirm="selectorPers" />
                      <!-- <el-input v-model="temp.memberName" :readonly='true' :disabled="dialogStatus === 'detail' || dialogStatus === 'update'" @focus="selectPerson" class="formItemDutyIn" placeholder="请选择"></el-input> -->
                      <!-- <el-button
                        v-show="dialogStatus === 'create'"
                        style="margin-left: 20px"
                        type="primary"
                        size="small"
                        @click="innerVisible = true"
                      >
                        选择人员
                      </el-button> -->
                    </el-form-item>
                  </el-col>
                  <el-col :span="8">
                    <el-form-item label="性别" prop="" class="formItemDuty" style="border-top: 0px;">
                      <el-input v-model="temp.sex" disabled class="formItemDutyIn" />
                    </el-form-item>
                  </el-col>
                  <el-col :span="8">
                    <el-form-item label="出生日期" prop="" class="formItemDuty" style="border-top: 0px;">
                      <el-input v-model="temp.birthday" disabled class="formItemDutyIn" />
                    </el-form-item>
                  </el-col>
                </el-row>
                <el-row>
                  <el-col :span="8">
                    <el-form-item label="民族" prop="" class="formItemDuty">
                      <el-input v-model="temp.nation" disabled class="formItemDutyIn" />
                    </el-form-item>
                  </el-col>
                  <el-col :span="8">
                    <el-form-item label="文化程度" prop="" class="formItemDuty">
                      <el-input v-model="temp.educationBackground" disabled class="formItemDutyIn" />
                    </el-form-item>
                  </el-col>
                  <el-col :span="8">
                    <el-form-item label="入党时间" prop="" class="formItemDuty">
                      <el-input v-model="temp.partyDate" disabled class="formItemDutyIn" />
                    </el-form-item>
                  </el-col>
                </el-row>
                <el-row>
                  <el-col :span="12">
                    <el-form-item label="参加工作时间" prop="" class="formItemDuty">
                      <el-date-picker
                        v-model="temp.startWorkDate"
                        :disabled="dialogStatus === 'detail'"
                        :editable="false"
                        value-format="yyyy-MM-dd HH:mm:ss"
                        type="date"
                        class="formItemDutyIn"
                        style="border-left: 1px solid #000000;width: 100%;"
                      />
                    </el-form-item>
                  </el-col>
                  <el-col :span="12">
                    <el-form-item label="联系方式" prop="" class="formItemDuty">
                      <el-input v-model="temp.phone" disabled class="formItemDutyIn" />
                    </el-form-item>
                  </el-col>
                </el-row>
                <el-row>
                  <el-col :span="24">
                    <el-form-item label="身份证号" prop="" class="formItemDuty">
                      <el-input v-model="temp.idNo" disabled class="formItemDutyIn" />
                    </el-form-item>
                  </el-col>
                </el-row>
              </el-col>
              <el-col :span="4">
                <div style="text-align:center">
                  <img :src="temp.avatar" class="DutyAvatar" draggable="false">
                </div>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="24">
                <el-form-item label="所在支部" prop="orgId" class="formItemDuty">
                  <el-popover
                    v-model="popoverShow"
                    disabled
                    placement="bottom"
                    trigger="click"
                  >
                    <el-tree
                      class="tree"
                      style="max-height: 274px;overflow-y: auto;"
                      width="200px"
                      :data="tree"
                      :props="defaultProps"
                      :default-expand-all="true"
                      :expand-on-click-node="false"
                      @node-click="selectOrg"
                    />
                    <el-input
                      slot="reference"
                      class="formItemDutyIn"
                      style="border-right: 0px;"
                      disabled
                      :value="temp.parentOrgName"
                      :readonly="true"
                    />
                  </el-popover>
                </el-form-item>
              </el-col>
            </el-row>
          </el-row>
          <el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="是否党委成员" prop="dutyType" class="formItemDuty">
                  <div class="formItemDutyIn" style="background-color: white;text-align: center;">
                    <el-radio-group v-model="temp.dutyType" :disabled="dialogStatus === 'detail'">
                      <el-radio :label="1">是</el-radio>
                      <el-radio :label="2">否</el-radio>
                    </el-radio-group>
                  </div>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="是否纪委成员" prop="dutyTypeDiscipline" class="formItemDuty">
                  <div class="formItemDutyIn" style="background-color: white;text-align: center;border-right: 0px;">
                    <el-radio-group v-model="temp.dutyTypeDiscipline" :disabled="dialogStatus === 'detail'">
                      <el-radio :label="1">是</el-radio>
                      <el-radio :label="2">否</el-radio>
                    </el-radio-group>
                  </div>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="党内职务及任职时间" prop="duty" class="formItemDuty">
                  <div style="border-bottom: 1px solid #000000;">
                    <el-select
                      v-model="temp.duty"
                      :disabled="dialogStatus === 'detail'"
                      placeholder="请选择"
                      style="border-left: 1px solid #000000;"
                    >
                      <el-option
                        v-for="item in partyMemberDutyList"
                        :key="item.id"
                        :label="item.dictName"
                        :value="Number(item.dictCode)"
                      />
                    </el-select>
                  </div>
                  <el-date-picker
                    v-model="temp.employmentDateStr"
                    :disabled="dialogStatus === 'detail'"
                    :editable="false"
                    value-format="yyyy-MM-dd"
                    type="date"
                    style="border-left: 1px solid #000000;width: 99.6%;"
                  />
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="专兼职情况" prop="partTime" style="height: 75.6px;border-left: 1px solid #000000;margin-left: -1px;" class="formItemDuty partTimeCenter">
                  <el-select
                    v-model="temp.partTime"
                    :disabled="dialogStatus === 'detail'"
                    placeholder="请选择"
                    style="border-left: 1px solid #000000;"
                    class="partTime-select"
                  >
                    <el-option
                      v-for="item in partTimeList"
                      :key="item.key"
                      :label="item.value"
                      :value="item.key"
                    />
                  </el-select>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="新任职书记" prop="" class="formItemDuty">
                  <div class="formItemDutyIn" style="background-color: white;text-align: center;">
                    <el-radio-group v-model="temp.isNewTakeOffice" :disabled="dialogStatus === 'detail'">
                      <el-radio :label="1">是</el-radio>
                      <el-radio :label="2">否</el-radio>
                    </el-radio-group>
                  </div>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="新任职时间" prop="" class="formItemDuty">
                  <el-date-picker
                    v-model="temp.takeOfficeDate"
                    :disabled="dialogStatus === 'detail'||temp.isNewTakeOffice === 2"
                    :editable="false"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    type="date"
                    style="border-left: 1px solid #000000;width: 100%;"
                  />
                </el-form-item>
              </el-col>
            </el-row>
          </el-row>
          <el-row>
            <el-col :span="24">
              <el-form-item label="任职培训情况" prop="" class="formItemDuty center">
                <el-input v-model="temp.takeOfficeTrain" type="textarea" maxlength="250" show-word-limit :rows="8" class="formItemDutyIn" style="border-right: 0px;" :disabled="dialogStatus === 'detail'" />
              </el-form-item>
            </el-col>
          </el-row>
        </el-form>

        <div slot="footer" class="dialog-footer">
          <el-button
            v-show="dialogStatus !== 'detail'"
            type="primary"
            :loading="dutyBtnLoading"
            @click="dialogStatus === 'create' ? createDuty() : updateDuty()"
          >
            保存
          </el-button>
          <el-button @click="dialogFormVisible = false"> 关闭 </el-button>
        </div>
      </el-dialog>
<style lang="scss" scoped>
.dataForm{
  margin-top: 20px;
  border-left: 1px solid #000000;
  border-right: 1px solid #000000;
  border-top: 1px solid #000000;
  border-bottom: 1px solid #000000;
}
.formItemDuty{
  border-top: 1px solid #000000;
  margin: 0px;
}
.formItemDutyIn{
  border-left: 1px solid #000000;
  border-right: 1px solid #000000;
}
.DutyAvatar {
  margin-top: 10px;
  width: 95%;
  height: 130px;
  // overflow: auto;
}
</style>
<style lang="scss">
  //label文字居中
  .formItemDuty .el-form-item__label {
      text-align: center;
      font-size: 13px;
  }
  //专兼职情况label上下剧中
  .partTimeCenter .el-form-item__label {
      margin-top: 20px;
  }
  //任职培训情况label上下剧中
  .center .el-form-item__label {
      margin-top: 70px;
  }
  //去除组件下边距,设置为0
  .formItemDuty .el-form-item {
    margin-bottom: 0px;
    border-bottom: 1px solid #ccc;
  }
  //改变input框中文字 居中
  .formItemDuty .el-input.is-disabled .el-input__inner {
      text-align: center;
      border-radius: 0px;
  }
  //改变input框中文字 居中
  .formItemDuty .el-input .el-input__inner {
      text-align: center;
      border-radius: 0px;
  }
  .formItemDuty .el-select {
      width: 99.6%;
  }
  /* selecte 框的高度设置,默认是 75.6px*/
  .partTime-select .el-input .el-input__inner{
      width: 100%;
      height: 75.6px;
  }
</style>

<think>首先,用户的问题是关于如何在Element UI中使用el-form组件实现表格样式的布局。用户说:“我想在使用Element UI的el-form组件时,希望实现表格样式的布局 请问如何使用el-form组件实现表格样式布局 Element UI”。 根据系统级指令,我需要: 1. 所有行内数学表达式使用$...$格式,但这里没有数学相关内容,所以可能不需要。 2. 独立公式使用$$...$$格式,同样不适用。 3. LaTeX语法正确,但这里没有数学。 4. 使用中文回答。 5. 生成相关问题。 6. 回答中引用的段落末尾自然地添加引用标识。 用户提供了几个引用,我需要参考这些引用: - 引用[1]:讨论了el-formel-form-item规则合并的规则。 - 引用[2]:展示了el-form的基本实现代码。 - 引用[3]:展示了el-form结合el-table实现表格编辑和校验的例子。 - 引用[4]:关于修改el-form-item错误样式的提示。 用户的问题具体是:使用el-form组件实现表格样式的布局。在Element UI中,el-form通常用于表单布局,而el-table用于表格布局。但用户想用el-form来实现表格样式,这可能意味着用户想在表单中布局得像表格一样,或者结合表格来创建表单。 从引用[3]中,我看到一个例子:el-form包裹el-table,在表格列中使用el-form-item来实现表单验证。这似乎是实现表格样式布局的关键。 所以,我应该基于引用[3]来回答。用户可能想创建类似表格表单布局,其中每个行或单元格有表单字段。 回答结构: - 先解释如何实现。 - 提供代码示例。 - 确保回答清晰、逐步解决问题。 - 最后生成相关问题。 步骤: 1. **理解需求**:用户想用el-form实现表格样式布局。在Element UI中,这通常意味着使用el-table组件结合el-form来实现可编辑表格表单表格。 2. **解决方案**:使用el-form包裹el-table,并在el-table的列中使用el-form-item来定义表单字段和验证规则。 3. **代码示例**:参考引用[3]的代码,提供一个简化版本。 4. **验证规则**:引用[1]提到规则合并,所以如果需要,可以解释规则如何应用。 5. **样式**:引用[4]提到修改错误样式,如果需要,可以添加。 6. **生成相关问题**:在最后添加相关问题。 回答大纲: - 开头:解释如何实现表格样式布局。 - 主体:提供代码示例和解释。 - 结尾:总结并生成相关问题。 代码示例:基于引用[3],创建一个简单的例子。 确保回答真实可靠:基于Element UI文档和引用。 最终,用中文回答。</think>### 使用 Element UI 的 el-form 组件实现表格样式布局 在 Element UI 中,`el-form` 组件主要用于表单布局,而 `el-table` 组件用于表格布局。要实现“表格样式布局”,通常需要将两者结合:用 `el-form` 包裹 `el-table`,并在表格的列中嵌入 `el-form-item` 组件。这样既能保持表格的网格结构,又能为每个单元格添加表单验证功能(如输入框、选择器等)。以下是逐步实现方法: #### 步骤 1: 基本结构 - 使用 `el-form` 包裹 `el-table`,并通过 `:model` 绑定表单数据对象。 - 在 `el-table` 的列中,使用 `<template>` 插槽嵌入 `el-form-item` 和表单字段(如 `el-input`)。 - 关键点:`el-form-item` 的 `:prop` 属性需动态绑定到表格数据的索引路径(例如 `:prop="tableData.${index}.fieldName"`),以确保验证规则能正确应用到每个单元格[^3]。 示例代码: ```vue <template> <el-form ref="formRef" :model="formData" :rules="formRules"> <el-table :data="formData.tableData" border style="width: 100%"> <el-table-column label="姓名" prop="name"></el-table-column> <el-table-column label="年龄" prop="age"></el-table-column> <el-table-column label="邮箱"> <template v-slot="scope"> <!-- 动态绑定prop到表格行数据的路径 --> <el-form-item :prop="`tableData.${scope.$index}.email`" :rules="formRules.email" > <el-input v-model="scope.row.email" placeholder="请输入邮箱"></el-input> </el-form-item> </template> </el-table-column> </el-table> <el-button type="primary" @click="submitForm">提交</el-button> </el-form> </template> <script> export default { data() { return { formData: { tableData: [ { name: '张三', age: 25, email: '' }, { name: '李四', age: 30, email: '' } ] }, formRules: { email: [ { required: true, message: '邮箱不能为空', trigger: 'blur' }, { type: 'email', message: '请输入有效的邮箱地址', trigger: 'blur' } ] } }; }, methods: { submitForm() { this.$refs.formRef.validate(valid => { if (valid) { console.log('表单验证通过', this.formData); } else { console.log('表单验证失败'); } }); } } }; </script> ``` #### 步骤 2: 验证规则处理 - 如果同时在 `el-form` 和 `el-form-item` 上绑定规则,`el-form-item` 的规则会覆盖 `el-form` 的规则(引用[1])。 - 在动态绑定的 `:prop` 中,路径需精确到表格行索引(如 `tableData.0.email`),否则验证可能失效[^3]。 #### 步骤 3: 样式优化 - **表格外观**:通过 `el-table` 的 `border`、`stripe` 等属性调整样式,使其更像传统表格- **错误提示**:如需自定义验证错误样式,可参考引用[4],使用 `/deep/` 修改 `.el-form-item__error`: ```vue <style lang="less" scoped> /deep/ .el-form-item__error { color: #ff9900; /* 橙色错误提示 */ font-size: 12px; } </style> ``` #### 注意事项 - **性能**:当表格数据量大时,动态绑定 `:prop` 可能影响性能。建议使用虚拟滚动或分页优化。 - **数据绑定**:确保 `v-model` 绑定到 `scope.row`,以直接修改表格行数据。 - **兼容性**:此方法在 Element UI 2.x 中有效,如使用 Vue 3,需适配 Element Plus。 通过以上方法,`el-form` 能实现类似表格的布局,同时保留表单验证功能。适用于动态数据编辑场景,如后台管理系统中的批量编辑表格[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值