element-ui table表格实现手动新增功能

80 阅读4分钟
效果

gif-2024-03-13 at 11.46.54.gif

代码:
<template>
    <div class="organization-work-drawer-container1">
      <!-- 标题 -->
      <div class="drawer-header">
        <h4>{{ isNewAdd ? "新建用户信息" : "编辑用户信息" }}</h4>
        <i class="el-icon-close"></i>
      </div>
      <!-- 内容区域 -->
      <div class="edit-user-info-box">
        <el-form
          :model="ruleForm"
          :rules="rules"
          ref="ruleForm"
          label-width="100px"
        >
          <!-- 基本信息 -->
          <div class="base-info-box">
            <p class="base-info-title">基本信息</p>
            <el-row :gutter="20">
              <el-col :span="24" class="item-avator">
                <el-upload
                  action="https://jsonplaceholder.typicode.com/posts/"
                  :show-file-list="false"
                  :on-success="handleAvatarSuccess"
                  :before-upload="beforeAvatarUpload"
                >
                  <img v-if="imageUrl" :src="imageUrl" class="avatar" />
                  <i v-else class="el-icon-s-custom" style="font-size: 50px"></i>
                </el-upload>
              </el-col>
            </el-row>
            <el-row :gutter="20">
              <el-col :span="12">
                <el-form-item label="用户姓名" prop="user_name">
                  <el-input
                    :disabled="isNewAdd ? false : true"
                    v-model="ruleForm.user_name"
                    clearable
                    placeholder="请输入"
                    style="width: 240px;"
                  ></el-input>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="用户账号" prop="user_count">
                  <el-input
                    :disabled="isNewAdd ? false : true"
                    v-model="ruleForm.user_count"
                    clearable
                    placeholder="请输入"
                    style="width: 240px;"
                  ></el-input>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row :gutter="20">
              <el-col :span="12">
                <el-form-item label="角色" prop="role">
                  <TreeSelect
                    v-model="ruleForm.role"
                    @update:selectValue="handleSelectValueChange"
                  ></TreeSelect>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="身份证号" prop="ID">
                  <el-input
                    clearable
                    v-model="ruleForm.ID"
                    placeholder="请输入"
                    style="width: 240px;"
                  ></el-input>
                </el-form-item>
              </el-col>
            </el-row>
          </div>
  
          <!-- 所属部门 -->
          <div class="base-info-box">
            <p class="base-info-title">所属部门</p>
            <el-table :data="tableData" style="width: 100%">
              <el-table-column prop="department" label="所属部门">
                <template slot-scope="scope">
                  <p v-if="scope.row.department && scope.row.is_default == '是'">
                    <el-input
                      :disabled="
                        scope.row.department && scope.row.is_default == '是'
                          ? true
                          : false
                      "
                      v-model="scope.row.department"
                      placeholder="请选择"
                      clearable
                    ></el-input>
                  </p>
                  <p v-else>
                    <el-input
                      v-model="scope.row.department"
                      placeholder="请选择"
                      @focus="showDepartmentDialog(scope.$index)"
                      clearable
                    ></el-input>
                  </p>
                </template>
              </el-table-column>
              <el-table-column prop="reports_to" label="直属主管">
                <template slot-scope="scope">
                  <!-- <p v-if="scope.row.reports_to">
                    <el-input
                      :disabled="scope.row.reports_to"
                      v-model="scope.row.reports_to"
                      placeholder="请选择"
                      clearable
                    ></el-input>
                  </p>
                  <p v-else>
                    <el-input
                      v-model="scope.row.reports_to"
                      placeholder="请选择"
                      @focus="showDepartmentDialog1(scope.$index)"
                      clearable
                    ></el-input>
                  </p> -->
                  <el-input
                    v-model="scope.row.reports_to"
                    placeholder="请选择"
                    @focus="showDepartmentDialog1(scope.$index)"
                    clearable
                  ></el-input>
                </template>
              </el-table-column>
              <el-table-column prop="is_main_department" label="是否主部门">
                <template slot-scope="scope">
                  <p v-if="scope.row.is_main_department === '是'">
                    <el-checkbox
                      v-model="scope.row.is_main_department === '是'"
                      :disabled="scope.row.is_main_department === '是'"
                    ></el-checkbox>
                  </p>
                  <p v-else>
                    <el-checkbox
                      :v-model="scope.row.is_main_department"
                      :disabled="scope.row.department ? false : true"
                    ></el-checkbox>
                  </p>
                </template>
              </el-table-column>
              <el-table-column label="操作" width="80">
                <template slot-scope="scope">
                  <el-button
                    @click="delIndexUser(scope.$index, scope.row)"
                    type="text"
                    style="color: brown"
                    icon="el-icon-delete"
                    size="mini"
                  ></el-button>
                </template>
              </el-table-column>
            </el-table>
            <p
              style="
                font-size: 15px;
                color: #448ef7;
                cursor: pointer;
                margin-bottom: 30px;
                margin-top: 2px;
              "
            >
              <i class="el-icon-plus" @click="addTableRow"></i>
              <span style="padding-left: 8px" @click="addTableRow">添加行</span>
            </p>
          </div>
  
          <!-- 联系方式 -->
          <div class="base-info-box">
            <p class="base-info-title">联系方式</p>
            <el-row :gutter="20">
              <el-col :span="12">
                <el-form-item label="手机号" prop="phone">
                  <el-input
                    :disabled="isNewAdd ? false : true"
                    v-model="ruleForm.phone"
                    clearable
                    placeholder="请输入"
                    style="width: 240px;"
                  ></el-input>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="办公电话" prop="office_phone">
                  <el-input
                    clearable
                    v-model="ruleForm.office_phone"
                    placeholder="请输入"
                    style="width: 240px;"
                  ></el-input>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row :gutter="20">
              <el-col :span="12">
                <el-form-item label="邮箱" prop="email">
                  <el-input
                    v-model="ruleForm.email"
                    placeholder="请输入"
                    clearable
                    style="width: 240px;"
                  ></el-input>
                </el-form-item>
              </el-col>
            </el-row>
          </div>
  
          <!-- 员工信息 -->
          <div class="base-info-box">
            <p class="base-info-title">员工信息</p>
            <el-row :gutter="20">
              <el-col :span="12">
                <el-form-item label="员工编号" prop="employee_number">
                  <el-input
                    v-model="ruleForm.employee_number"
                    clearable
                    placeholder="请输入"
                    style="width: 240px;"
                  ></el-input>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="入职时间" prop="entry_time">
                  <el-date-picker
                    v-model="ruleForm.entry_time"
                    align="right"
                    type="date"
                    placeholder="请选择"
                    clearable
                    style="width: 240px;"
                  >
                  </el-date-picker>
                </el-form-item>
              </el-col>
            </el-row>
          </div>
        </el-form>
      </div>
  
      <!-- 按钮区域 -->
      <div class="btns-box">
        <el-button style="width: 80px; height: 32px" type="primary">
          保存
        </el-button>
      </div>
  
      <!-- 所属部门 -->
      <el-dialog
        title="提示"
        :visible.sync="isShowDialog"
        width="30%"
        :modal="false"
        :before-close="handleClose"
      >
        <el-input placeholder="输入关键字进行过滤" v-model="filterText">
        </el-input>
  
        <el-tree
          class="filter-tree"
          :data="data"
          :props="defaultProps"
          default-expand-all
          :filter-node-method="filterNode"
          ref="tree"
          @node-click="treeNodeClick"
        >
        </el-tree>
        <span slot="footer" class="dialog-footer">
          <el-button @click="isShowDialog = false">取 消</el-button>
          <el-button type="primary" @click="confirmDepartmentDialog">
            确 定
          </el-button>
        </span>
      </el-dialog>
  
      <!-- 直属主管 -->
      <el-dialog
        title="提示"
        :visible.sync="isShowDialog1"
        width="30%"
        :modal="false"
        :before-close="handleClose1"
      >
        <el-input placeholder="输入关键字进行过滤" v-model="filterText1">
        </el-input>
  
        <el-tree
          class="filter-tree1"
          :data="data"
          :props="defaultProps"
          default-expand-all
          :filter-node-method="filterNode1"
          ref="tree1"
          @node-click="treeNodeClick1"
        >
        </el-tree>
        <span slot="footer" class="dialog-footer">
          <el-button @click="isShowDialog1 = false">取 消</el-button>
          <el-button type="primary" @click="confirmDepartmentDialog1">
            确 定
          </el-button>
        </span>
      </el-dialog>
    </div>
  </template>
  
  <script>
  import TreeSelect from "./TreeSelect.vue";
  
  export default {
    components: {
      TreeSelect,
    },
    props: {
      isNewAdd: {
        type: Boolean,
        default: false,
      },
    },
    data() {
      return {
        ruleForm: {
          user_name: "xxx",
          user_count: "2234",
          role: "",
          ID: "",
          phone: "13594734401",
          office_phone: "",
          email: "",
          entry_time: "",
          employee_number: "",
        },
        rules: {
          user_name: [
            { required: true, message: "请输入用户姓名", trigger: "blur" },
          ],
          user_count: [
            { required: true, message: "请输入用户账号", trigger: "blur" },
          ],
          phone: [{ required: true, message: "请输入手机号", trigger: "blur" }],
        },
        imageUrl: "",
  
        // 表格
        tableData: [
          {
            department: "研发中心",
            reports_to: "",
            is_main_department: "是",
            is_default: "是",
          },
        ],
        checked: false,
        isShowDialog: false,
        filterText: "",
        isShowDialog1: false,
        filterText1: "",
        data: [
          {
            id: 1,
            label: "一级 1",
            children: [
              {
                id: 4,
                label: "二级 1-1",
                children: [
                  {
                    id: 9,
                    label: "三级 1-1-1",
                  },
                  {
                    id: 10,
                    label: "三级 1-1-2",
                  },
                ],
              },
            ],
          },
          {
            id: 2,
            label: "一级 2",
            children: [
              {
                id: 5,
                label: "二级 2-1",
              },
              {
                id: 6,
                label: "二级 2-2",
              },
            ],
          },
          {
            id: 3,
            label: "一级 3",
            children: [
              {
                id: 7,
                label: "二级 3-1",
              },
              {
                id: 8,
                label: "二级 3-2",
              },
            ],
          },
        ],
        defaultProps: {
          children: "children",
          label: "label",
        },
        currentTreeValueDepartment: "",
        selectedIndex: -1,
        currentTreeValueDepartment1: "",
        selectedIndex1: -1,
  
        // 员工信息
      };
    },
    created() {},
    watch: {
      filterText(val) {
        this.$refs.tree.filter(val);
      },
      filterText1(val) {
        this.$refs.tree1.filter(val);
      },
      isNewAdd(newVal, oldVal) {
        // if (newVal) {
        //   this.clearForm();
        // }
      },
    },
    methods: {
      filterNode(value, data) {
        if (!value) return true;
        return data.label.indexOf(value) !== -1;
      },
      filterNode1(value, data) {
        if (!value) return true;
        return data.label.indexOf(value) !== -1;
      },
      // clearForm() {
      //   this.ruleForm = {
      //     user_name: "",
      //     user_count: "",
      //     role: "",
      //     ID: "",
      //     phone: "",
      //     office_phone: "",
      //     email: "",
      //     entry_time: "",
      //     employee_number: "",
      //   };
      // },
  
      /**
       * 头像上传逻辑
       */
      handleAvatarSuccess(res, file) {
        this.imageUrl = URL.createObjectURL(file.raw);
      },
      beforeAvatarUpload(file) {
        const isJPG = file.type === "image/jpeg";
        const isLt2M = file.size / 1024 / 1024 < 2;
  
        if (!isJPG) {
          this.$message.error("上传头像图片只能是 JPG 格式!");
        }
        if (!isLt2M) {
          this.$message.error("上传头像图片大小不能超过 2MB!");
        }
        return isJPG && isLt2M;
      },
  
      /**
       * 表格逻辑
       */
      // 删除
      delIndexUser(index, row) {
        if (row.is_main_department == "是") {
          return this.$message({
            message: "主部门不能删除",
            type: "warning",
          });
        }
        this.tableData.splice(index, 1);
      },
      // 添加行
      addTableRow() {
        this.tableData.push({
          department: "",
          reports_to: "",
          is_main_department: false,
        });
      },
      // 所属部门
      treeNodeClick(val) {
        this.currentTreeValueDepartment = val.label;
      },
      confirmDepartmentDialog() {
        if (this.selectedIndex !== -1) {
          this.tableData[this.selectedIndex].department =
            this.currentTreeValueDepartment;
          // 重置索引
          this.selectedIndex = -1;
        }
        this.isShowDialog = false;
      },
      showDepartmentDialog(index) {
        this.selectedIndex = index;
        this.isShowDialog = true;
        this.filterText = "";
        this.filterText1 = "";
      },
      handleClose(done) {
        done();
      },
      // 直属主管
      treeNodeClick1(val) {
        this.currentTreeValueDepartment1 = val.label;
      },
      confirmDepartmentDialog1() {
        if (this.selectedIndex1 !== -1) {
          this.tableData[this.selectedIndex1].reports_to =
            this.currentTreeValueDepartment1;
          // 重置索引
          this.selectedIndex1 = -1;
        }
        this.isShowDialog1 = false;
      },
      showDepartmentDialog1(index) {
        this.selectedIndex1 = index;
        this.isShowDialog1 = true;
        this.filterText = "";
        this.filterText1 = "";
      },
      handleClose1(done) {
        done();
      },
  
      /**
       * 基本信息逻辑
       */
      handleSelectValueChange(value) {
        if (value && value.length > 0) {
          this.ruleForm.role = value;
        } else {
          this.ruleForm.role = "";
        }
      },
    },
  };
  </script>
  
  <style scoped lang="scss">
  .organization-work-drawer-container1 {
    ::v-deep .el-form-item--medium .el-form-item__label {
      text-align: left !important;
    }
  
    .drawer-header {
      border-bottom: 1px solid #eee;
      height: 50px;
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 0 20px;
  
      h4 {
        margin: 0;
        margin-bottom: 10px;
        color: #111218;
      }
    }
  
    .edit-user-info-box {
      padding: 20px;
    }
  
    .item-avator {
      margin-bottom: 20px;
    }
  
    .base-info-box {
      .base-info-title {
        padding-bottom: 6px;
        text-align: left;
        font-size: 16px;
        color: #000;
        font-weight: 600;
      }
    }
  
    .btns-box {
      display: flex;
      align-items: center;
      justify-content: center;
      border-top: 1px solid #eee;
      height: 50px;
    }
  }
  </style>