elementui中的table组件封装

96 阅读1分钟

ListTable.vue

<template>
  <div>
    <slot name="header" :scope="{ form, search, create }" />
    <el-table :data="tableData" style="width: 100%">
      <el-table-column align="center" :key="item.key" :label="item.label" :width="item.width ? item.width : ''"
        v-for="item in head">
        <template slot-scope="scope">
          <i class="el-icon-time"></i>
          <span style="margin-left: 10px">{{ scope.row[item.key] }}</span>
        </template>
      </el-table-column>

      <el-table-column v-if="operate.length > 0" label="操作" :width="operate.length * 80" align="center">
        <template slot-scope="scope">
          <div style="display: flex; flex-direction: row;">
            <template v-for="(item, index) in operate">
              <div :key="index" style="margin: 0 5px">
                <el-button v-if="item.type == 'edit'" size="mini" :title="item.name" type="primary"
                  @click="handleEdit(scope.row)">
                  {{ item.name }}
                </el-button>
                <el-button v-else-if="item.type == 'delete'" size="mini" :title="item.name" type="danger"
                  @click="handleDelete(scope.row.id, scope.$index)">
                  {{ item.name }}
                </el-button>
                <el-button v-else-if="item.type == 'detail'" size="mini" :title="item.name"
                  @click="handleDetail(scope.row)">
                  {{ item.name }}
                </el-button>
                <el-button v-else size="mini" :title="item.name"
                  @click="$emit('click-item', { data: scope.row, index: scope.index, event: item.type })">
                  {{ item.name }}
                </el-button>

              </div>
            </template>
          </div>
        </template>
      </el-table-column>

    </el-table>
  </div>
</template>

<script>
export default {
  name: 'ListTable',
  props: {
    mode: {
      type: String,
      required: true,
      default: '',
    },
    head: {
      type: Array,
      required: true,
      default: function () {
        return []
      }
    },
    operate: {
      type: Array,
      required: true,
      default: function () {
        return []
      }
    }
  },
  data () {
    return {
      page: 1,
      pageSize: 30,
      list: [],
      total: 0,
      form: {},
      loading: true,
      tableData: [{
        date: '2016-05-02',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄'
      }, {
        date: '2016-05-04',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1517 弄'
      }, {
        date: '2016-05-01',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1519 弄'
      }, {
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1516 弄'
      }]
    }
  },
   computed: {
    //请求的接口地址
    getUrl () {
      let UpperCaseMode = this.mode.toUpperCase()
      return UpperCaseMode.replace(/-/g, '_') + '_LIST'
    },
    deleteUrl () {
      let UpperCaseMode = this.mode.toUpperCase()
      return 'DELETE_' + UpperCaseMode.replace(/-/g, '_')
    },
    //跳转的表单路径
    editPath () {
      let path = ''

      switch (this.mode) {
        case 'user':
          path = 'user-edit'
          break
        case 'department':
          path = 'department-edit'
          break
        case 'device':
          path = 'device-edit'
          break
        case 'train-device':
          path = 'train-device-edit'
          break
        case 'track':
          path = 'track-edit'
          break
        case 'train':
          path = 'train-edit'
          break
        case 'route':
          path = 'route-edit'
          break
      }

      return path
    },
  },
  created () {
    //获取表格数据 
    this.getData(this.page, this.pageSize)
  },
  mounted () { },
  methods: {

    // 获取表格数据
    getData (page, pageSize) {
      console.log('getData进来了', this.getUrl);
      let params = {
        page: page,
        pageSize: pageSize,
      }
      params = {
        ...params,
        ...this.form,
      }

      this.$request(this.getUrl, params)
        .then(({ data }) => {
          this.loading = false
          const { list, totalSize } = data
          console.log('mode', this.mode);
          this.list = list;
          this.total = parseInt(totalSize)

        })
        .catch(error => {
          this.loading = false
        })

    },

      //新建
    create () {
       if (!this.editPath) {
        return
      }
      this.$router.push({ path: this.editPath, query: { mode: 'new' } })
    },

    //点击表格的编辑按钮
    handleEdit (data) { 
      localStorage.setItem('dataForm', JSON.stringify(data))
      if (!this.editPath) {
        return
      }

      this.$router.push({
        path: this.editPath,
        query: { id: data.id, mode: 'edit' },
      })
    },

    handleDetail (data) { },

    handleDelete (id, index) { },

    search () {
      console.log('调用了search方法');
    },
  
  }
}
</script>

调用封装的table组件

<template>
  <list-table
    :head="head"
    :operate="operate"
    mode="user"
  >
    <div
      slot="header"
      slot-scope="{scope}"
      class="header"
    >
      <el-button
        type="primary"
        size="mini"
        @click="scope.create()"
      >
        新建
      </el-button>
    </div>
  </list-table>
</template>
<script>
export default {
  name: 'UserManage',
  data() {
    return {
      head: [
        {
          label: '用户名',
          key: 'username',
        },
        {
          label: '年龄',
          key: 'age',
        },
        {
          label: '工号',
          key: 'nfc',
        },
        {
          label: '职位',
          key: 'post_name',
        },
        {
          label: '真实姓名',
          key: 'name',
        },
        {
          label: '角色',
          key: 'role_name',
        },
      ],
      operate: [
        {
          name: '编辑',
          type: 'edit',
        },
        {
          name: '删除',
          type: 'delete',
        },
      ],
    }
  },
}
</script>

跳转到编辑/新建的form表单页面

<template>
  <div class="new-user">
    <el-form ref="dataForm" :model="dataForm" label-width="100px" :rules="rules">
      <el-row>
        <el-col :offset="5" :span="7">
          <el-form-item label="用户名" prop="username">
            <el-input v-model="dataForm.username" />
          </el-form-item>
          <el-form-item label="姓名" prop="name">
            <el-input v-model="dataForm.name" />
          </el-form-item>
          <el-form-item label="工龄" prop="age">
            <el-input v-model="dataForm.age" />
          </el-form-item>
          <el-form-item label="工号" prop="number">
            <el-input v-model="dataForm.number" />
          </el-form-item>
          <el-form-item label="部门" prop="department_id">
            <el-select v-model="dataForm.department_id" placeholder="请选择部门">
              <el-option v-for="dep in departments" :key="dep.id" :label="dep.dep_name" :value="dep.id" />
            </el-select>
          </el-form-item>
          <el-form-item label="职位" prop="post_id_list">
            <el-select v-model="dataForm.post_id_list" multiple placeholder="请选择职位">
              <el-option v-for="post in posts" :key="post.id" :label="post.name" :value="post.id" />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="7">
          <el-form-item v-if="mode == 'new'" label="密码" prop="password">
            <el-input v-model="dataForm.password" type="password" />
          </el-form-item>
          <el-form-item label="电话号码" prop="phone_number">
            <el-input v-model="dataForm.phone_number" />
          </el-form-item>
          <el-form-item label="人员状态" prop="status">
            <el-select v-model="dataForm.status">
              <el-option v-for="item of stateList" :key="item.id" :label="item.label" :value="item.id" />
            </el-select>
          </el-form-item>
          <el-form-item label="站点" prop="station_id">
            <el-input v-model="dataForm.station_id" />
          </el-form-item>
        </el-col>
        <el-col :offset="5" :span="14">
          <el-form-item>
            <el-button type="primary" @click="submit('dataForm')">
              {{ modeName }}
            </el-button>
            <el-button @click="$router.back()">
              返回
            </el-button>
            <el-button @click="resetForm('dataForm')">
              重置
            </el-button>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
  </div>
</template>
<script>
export default {
  data () {
    return {
      modeName: '',
      mode: '', //new或者edit
      dataForm: {
        username: '',
        password: '',
        name: '',
        phone_number: '',
        number: '',
        department_id: '',
        post_id_list: [],
        role_id: [],
        age: '',
        entry_time: '',
        avatar: '',
        station_id: '106',
        status: 1,
      },
    }
  },
  created () {
    let mode = this.$route.query.mode
    this.mode = mode

    this.modeName = mode == 'edit' ? '修改' : '新增'
  },
  methods: {
    submit (formName) {
      this.$refs[formName].validate(async (valid) => {
        if (valid) {
          let data = this.dataForm
         
          data = {
            ...data,
            post_id_list: data.post_id_list.join(','),
          }
          //密码加密
          data = Object.assign(data, {
            password: md5(data.password)
          })
        
          const url = this.mode === 'new' ? 'NEW_USER' : 'EDIT_USER'
          const options = {
            params: pick(data, [
              'id',
              'username',
              'password',
              'phone_number',
              'email',
              'number',
              'age',
              'department_id',
              'post_id_list',
              'status',
              'station_id',
              'name',
            ]),
            ...(this.avatarForm ? {
              data: this.avatarForm
            } : null),
          }

          this.$request(url, options)
            .then(res => {
              this.$message({
                message: `${this.modeName}成功`,
                showClose: true,
                duration: 2000,
                type: 'success',
              })
              this.$router.push(`/system/user`)
            })
            .catch(error => {
              console.log('新增用户error', error);
              this.$message({
                message: `${this.modeName}失败`,
                showClose: true,
                duration: 2000,
                type: 'error',
              })
              this.$router.push(`/system/user`)
            })


        } else {
          console.log('error submit!!')
          return false
        }
      })
    },
    resetForm (formName) {
      this.$refs[formName].resetFields()
    },
  }
}
</script>