动态渲染element组件el-table表头项+自定义el-table列表项

动态渲染el-table表头项+自定义el-table列表项

现在不少项目的表格需要结合穿梭框动态显示表头有哪些项,但按照el-table原本的设置,有多少项就直接在html写多少个el-table-column,这样对于动态显示内容来说很麻烦,下面看简单的实现效果

这是默认全都显示
在这里插入图片描述
选择隐藏项
在这里插入图片描述
这是选择后的列表内容
在这里插入图片描述
下面上代码

//右边的抽屉和里面的穿梭框
      <el-drawer
          title=""
          size="800px"
          :visible.sync="drawer"
          :direction="direction"
          :before-close="handleClose"
        >
          <el-transfer
            filterable
            id="myTransfer"
            :titles="titles"
            :filter-method="filterMethod"
            filter-placeholder="请输入城市拼音"
            v-model="value"
            :data="data"
            @change="handleChange"
          >
          </el-transfer>
        </el-drawer>

//表格内容
  <el-table :data="tableData" style="width: 100%">
        <template v-for="(item, index) in data">
        //这是基础样式项
          <el-table-column
            v-if="item.label != '操作' && item.label != '就诊状态'"
            :prop="item.value"
            :label="item.label"
            :key="index"
            align="center"
          >
          </el-table-column>
		//就诊状态前面需要有个小伪元素所以就用了自定义列
          <el-table-column
            v-if="item.label == '就诊状态'"
            label="就诊状态"
            align="center"
            class-name="status_col"
            :key="index"
          >
            <template slot-scope="scope">
              <i
                class="status"
                :style="{ color: statusColor[scope.row.state] }"
              ></i>
              <span style="margin-left: 10px">{{ scope.row.stateName }}</span>
            </template>
          </el-table-column>
          //操作里面还需要再循环一次所以也用了自定义列
          <el-table-column
            v-if="item.label == '操作'"
            prop="state"
            label="操作"
            align="center"
            :key="index"
          >
            <template slot-scope="scope">
              <span
                v-for="ele in scope.row.operations"
                style="
                  display: inline-block;
                  margin-left: 10px;
                  cursor: pointer;
                "
                :class="{ stop: ele.id == 1 }"
                :key="ele.id"
                >{{ ele.title }}
              </span>
            </template>
          </el-table-column>
        </template>
      </el-table>
export default {
 data() {
    const generateData = (_) => {
      const data = [];
      const cities = [
        "序号",
        "姓名",
        "性别",
        "年龄",
        "手机号",
        "就诊状态",
        "就诊时间",
        "科室",
        "操作",
      ];
      const pinyin = [
        "xuhao",
        "xingming",
        "xingbie",
        "nianling",
        "shoujihao",
        "jiuzhenzhuangtai",
        "jiuzhenshijian",
        "keshi",
        "caozuo",
      ];
      const value = [
        "id",
        "patientName",
        "sexName",
        "age",
        "phone",
        "stateName",
        "acceptsTime",
        "departmentName",
        "zhuangtai",
        "",
      ];
      cities.forEach((city, index) => {
        data.push({
          label: city,
          key: index,
          pinyin: pinyin[index],
          value: value[index],
        });
      });
      return data;
    };
    return {
      statusColor: ["#FF5252", "#1CD86C", "#2C92F0", "#6E6E6E", "#FF52A3"],
      operations: [],
      drawer: false,
      direction: "rtl",
      tableHeader:[],
      data: generateData(),
      value: [],
      titles: ["显示", "隐藏"],
      filterMethod(query, item) {
        return (
          item.label.indexOf(query) > -1 || item.pinyin.indexOf(query) > -1
        );
      },
      movedKeys: [],
    };
  },
  created() {
    this.getMedicalList();
    this.tableHeader = this.data;
  },
  methods:{
        //关闭右边抽屉并更新表头内容
       handleClose(done) {
         done();
        this.tableHeader = this.data.filter((item, index) => {
        if (this.movedKeys.indexOf(index) == -1) {
          return item;
        } 
         });
      },

    //穿梭框数据左右移动
    handleChange(value, direction, movedKeys) {
      if (direction == "right") {
        movedKeys.forEach((item) => {
          this.movedKeys.push(item);
        });
      } else {
        this.movedKeys = this.movedKeys.filter((item) => {
          let newItem;
          movedKeys.forEach((ele) => {
            if (item != ele) {
              newItem = item;
            }
          });
          return newItem;
        });
      }
    },
  }
  //获取就诊列表(这是我从后台请求的列表数据)
    async getMedicalList() {
      let req = {
        patientName: this.name,
        patientPhone: this.tel,
        length: 20,
        page: this.currentPage1,
        deptId: this.department,
        state: Number(this.status),
        startTime: this.time[0],
        endTime: this.time[1],
      };
      let res = await this.$store.dispatch(
        "recievePatient/getMedicalList",
        req
      );
      if (res) {
        this.tableData = res.list;

        //根据就诊状态判断操作类型
        res.list.forEach((item) => {
          if (item.state == 3) {
            item.operations = [
              {
                id: 0,
                title: "查看",
              },
              {
                id: 2,
                title: "---",
              },
            ];
          } else {
            item.operations = [
              {
                id: 0,
                title: "查看",
              },
              {
                id: 1,
                title: "停诊",
              },
            ];
          }
        });
      } else {
        this.tableData = [];
      }
    },
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值