美文网首页
可编辑表格

可编辑表格

作者: 夏日清风_期待 | 来源:发表于2021-12-02 11:19 被阅读0次
    效果图
    <!-- template  -->
    <!-- 表格 -->
        <el-table :data="tableData" border style="width: 100%">
          <el-table-column
            v-for="(th, index) in tableColumnList"
            :key="index"
            v-if="showThList.includes(th.prop)"
            :prop="th.prop"
            :label="th.label"
            :width="th.width || '160px'"
          >
            <template slot-scope="scope">
              <!-- 不可修改 -->
              <div v-if="th.type === 1">
                {{ scope.row[th.prop] }}
              </div>
              <!-- 可修改 -->
              <div v-else>
                <!-- 文本 -->
                <div v-if="th.type === 2">
                  <span
                    class="span-txt"
                    @dblclick="edit(scope.row, scope.$index)"
                    v-if="!scope.row.edit"
                  >
                    {{ scope.row[th.prop] }}
                  </span>
                  <el-input
                    v-model="scope.row[th.prop]"
                    type="text"
                    v-if="scope.row.edit"
                  ></el-input>
                </div>
                <!-- 单选、多选  -->
                <div v-if="[3, 4].includes(th.type)">
                  <span
                    class="span-txt"
                    @dblclick="edit(scope.row, scope.$index)"
                    v-if="!scope.row.edit"
                  >
                    {{ scope.row[th.prop] | getSelectVal(th.option) }}
                  </span>
                  <el-select
                    v-model="scope.row[th.prop]"
                    v-if="scope.row.edit"
                    placeholder="请选择"
                    :multiple="th.type === 4"
                  >
                    <el-option
                      v-for="item in th.option"
                      :key="item.id"
                      :label="item.name"
                      :value="item.id"
                    ></el-option>
                  </el-select>
                </div>
                <!-- 日期 -->
                <div v-if="th.type === 5">
                  <span
                    class="span-txt"
                    @dblclick="edit(scope.row, scope.$index)"
                    v-if="!scope.row.edit"
                  >
                    {{ scope.row[th.prop] }}
                  </span>
                  <el-date-picker
                    style="width: 100%"
                    v-model="scope.row[th.prop]"
                    v-if="scope.row.edit"
                    type="date"
                    format="yyyy-MM-dd"
                    value-format="yyyy-MM-dd"
                    placeholder="选择日期"
                  ></el-date-picker>
                </div>
              </div>
            </template>
          </el-table-column>
          <el-table-column fixed="right" label="操作" width="100" align="center">
            <template slot-scope="scope">
              <el-button
                v-if="!scope.row.edit"
                @click="edit(scope.row, scope.$index)"
                type="text"
                size="small"
              >
                编辑
              </el-button>
              <el-button
                v-else
                @click="toSub(scope.row, scope.$index)"
                type="text"
                size="small"
              >
                保存
              </el-button>
            </template>
          </el-table-column>
        </el-table>
    <!-- script -->
     data() {
        const typeList = () => {
          let arr = [
            { id: 1, name: '新签' },
            { id: 2, name: '续费' },
            { id: 3, name: '转介绍' },
          ]
          return arr
        } // 类型选项,后面要根据接口获取
        return {
          queryForm: {
            page: 1,
            size: 10,
          }, // 分页数据
          total: 0, // 数据总数
    
          tableData: [
            {
              id: 1,
              number: '学号1111',
              studentName: '王小虎',
              phone: '上海市普陀区金沙江路 1518 弄',
              type: '线上',
              source: '1',
              source1: [1, 2],
              date1: '2021-11-01',
            },
            {
              id: 2,
              number: '学号222',
              studentName: '王小虎',
              phone: '上海市普陀区金沙江路 1517 弄',
              type: '线上',
              source: '2',
              source1: [1, 2],
              date1: '2021-11-01',
            },
            {
              id: 3,
              number: '学号333',
              studentName: '王小虎',
              phone: '上海市普陀区金沙江路 1519 弄',
              type: '线上',
              source: '3',
              source1: [1, 2],
              date1: '2021-11-01',
            },
            {
              id: 4,
              number: '学号444',
              studentName: '王小虎',
              phone: '上海市普陀区金沙江路 1516 弄',
              type: '线上',
              source: '1',
              source1: [1, 2],
              date1: '2021-11-01',
            },
            {
              id: 5,
              number: '学号555',
              studentName: '王小虎5',
              phone: '上海市普陀区金沙江路 1516 弄',
              type: '线上',
              source: '1',
              source1: [1, 2],
              date1: '2021-11-05',
            },
          ], // 表格数据
          tableColumnList: [
            { prop: 'studentName', label: '学生名称', type: 1 },
            { prop: 'phone', label: '手机号码', type: 1 },
            { prop: 'number', label: '学号', type: 2 },
            { prop: 'type', label: '分类', type: 2 },
            { prop: 'source', label: '来源', type: 3, option: typeList() },
            { prop: 'source1', label: '来源1', type: 4, option: typeList(), },
            { prop: 'date1', label: '报名日期1', type: 5 },
            { prop: 'date2', label: '报名日期2', type: 5 },
            { prop: 'date3', label: '报名日期3', type: 5 },
            { prop: 'date4', label: '报名日期4', type: 5 },
          ], // 表格列名:prop(String) 列对应的字段; label(String) 列名;type(Number) 类型,1 不可编辑,2 文本,3 单选,4 多选,5 日期;options(Array) 单选和多选类型时对应的options;width(String) 单元格宽度,默认宽为160px; edit(Boolean) 是否在编辑状态,true为正在编辑;
          editIndex: '', // 编辑行的下标
          thData: [], // 表头数据
          showThList: [], // 显示的列 ["studentName", "number", "source", "source1", "date2", "date3", "date4", "date1", "type", "phone"]
        }
      },
    filters: {
        // select对应的name进行显示
        getSelectVal(val, list) {
          let txt = ''
          if (Array.isArray(val) && val.length) {
            // 多选处理
            val.forEach((ids) => {
              list.forEach((item) => {
                if (item.id == ids) {
                  txt += `${item.name},`
                }
              })
            })
            // 正则去掉最后一个逗号
            txt = txt.replace(/,$/gi, '')
          } else {
            // 单选处理
            txt = list.filter((item) => item.id == val)[0].name
          }
          return txt
        },
      },
    methods: {
      // 编辑
        edit(row, index) {
          // 保存之前没保存的,再编辑新的行
          if (this.editIndex !== '' || this.editIndex === 0)
            this.toSub(this.tableData[this.editIndex], this.editIndex)
    
          this.editIndex = index
          this.$set(this.tableData[index], 'edit', true)
        },
        // 提交编辑
        toSub(row, index) {
          console.log('提交编辑--- ', row)
          this.$set(this.tableData[index], 'edit', false)
          this.editIndex = ''
        },
    },
    

    相关文章

      网友评论

          本文标题:可编辑表格

          本文链接:https://www.haomeiwen.com/subject/sajyxrtx.html