element-ui el-table表头自定义配置,表格拖动排序

10 篇文章 0 订阅
5 篇文章 0 订阅

一 需求说明

      表格列太多,页面展示不下,希望可以对表头自定义配置,配置是否展示,宽度,顺序等等。配置绑定用户。

二 需求开发

   2.1在表头右侧添加按钮,使用caption元素,

createCaption() {
  const caption = document.createElement('caption'); // 创建元素
  caption.innerHTML = '<i class="el-icon-set-up"></i>'; // 图标样式
  document.querySelector('table').appendChild(caption); // 选择table标签并添加caption
  caption.addEventListener('click', () => { // 点击事件
    this.setTableHead();
  });
},

2.2 点击弹窗展示设置页面

 setTableHead() {
   this.tableHeadsListCopy = _.cloneDeep(this.tableHeadsList); // this.tableHeadsList是从后端接口获取的表头数据
   this.$refs.tableHead.isTableHead = true;
 },


// tableHeadsList示例
tableHeadsList: [
        { width: 'auto', isShow: true, isAuto: true, label: '新垣结一', prop: 'xxx' },
        { width: 'auto', isShow: true, isAuto: true, label: '石原里美', prop: 'xxx' },
        { width: 'auto', isShow: true, isAuto: true, label: '桥本爱', prop: 'xxx' },
        { width: 'auto', isShow: true, isAuto: true, label: '斋藤飞鸟', prop: 'xxx' }
      ],

<template>
  <div class="table-head">
    <el-dialog :close-on-click-modal="false" @opened="rowDrop" title="配置表头" :visible.sync="isTableHead" width="50%">
      <p class="tip">
        <i class="el-icon-s-opportunity"></i>
        <span> 可拖动行排序</span>
      </p>
      <el-table
        row-key="prop"
        :data="tableShowList">
        <el-table-column prop="label" label="表头名称" align="center"></el-table-column>
        <el-table-column label="是否显示" width="120" align="center">
          <template slot-scope="scope">
            <el-checkbox v-model="scope.row.isShow"></el-checkbox>
          </template>
        </el-table-column>
        <el-table-column label="调整顺序" width="120" align="center">
          <template slot-scope="scope">
            <i class="el-icon-rank"></i>
          </template>
        </el-table-column>
        <el-table-column label="调整表头宽度">
          <template slot-scope="scope">
            <div class="flex-col">
              <div>
                <el-radio v-model="scope.row.isAuto" :label="true">自适应</el-radio>
              </div>
              <div>
                <el-radio v-model="scope.row.isAuto" :label="false">固定宽度</el-radio>
                <el-input-number v-show="!scope.row.isAuto" v-model="scope.row.width" size="mini" controls-position="right" :min="100" :max="300"></el-input-number>
              </div>
            </div>
          </template>
        </el-table-column>
      </el-table>
      <div slot="footer" class="dialog-footer tc">
        <el-button size="medium" class="btn-wh" @click="isTableHead = false">关闭</el-button>
        <el-button size="medium" class="btn-blue" type="primary" @click="saveTableHead()">保存</el-button>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import Sortable from 'sortablejs';
export default {
  name: "tableHead",
  props: {
    tableShowList: Array
  },
  data() {
    return {
      isTableHead: false
    };
  },
  methods: {
    rowDrop() {
      const tbody = document.querySelector('.table-head .el-table__body-wrapper tbody');
      const _this = this;
      Sortable.create(tbody, {
        onEnd({ newIndex, oldIndex }) {
          const currRow = _this.tableShowList.splice(oldIndex, 1)[0];
          _this.tableShowList.splice(newIndex, 0, currRow);
        }
      });
    },
    saveTableHead() {
      this.isTableHead = false;
      this.$emit('saveTableHead', this.tableShowList);
    },
  }
};
</script>

<style lang="scss" scoped>
.table-head {

  .tip {

    i {
      color: #E6A23C;
    }

    font-size: 14px;
    padding-bottom: 10px;
  }

  .el-icon-rank {
    font-size: 18px;
    margin-left: 20px;
    cursor: move;
  }

  .point {
    color: #66b1ff;

    &:hover {
      color: #1A3679;
    }
  }
}
</style>

Sortable.js中文网|配置    sortablejs文档

参考的文档:element表格行列拖拽_寻梦无痕的博客-CSDN博客 element表格行列拖拽

2.4表格主页面

<el-table ref="table"
                class="collect-table"
                :resizable="true"
                v-loading="isTableData"
                stripe
                @filter-change="filterTable"
                @sort-change="sortChange"
                :header-cell-class-name="headCell"
                :border="true"
                :data="tableData">
        <el-table-column v-for="item in tableHeadsList.filter(item => item.isShow)"
                         :key="item.prop"
                         :width="item.isAuto ? 'auto' : item.width"
                         :filters="filtersCom(item.prop)"
                         :column-key="item.prop"
                         sortable
                         :prop="item.prop"
                         :label="item.label">
          <template slot-scope="scope">
            <span v-if="item.prop === 'agentStatus'">{{scope.row.time | timeFilter}}</span>
            <span v-else>{{scope.row[item.prop] || '无'}}</span>
          </template>
        </el-table-column>
      </el-table>

<table-head ref="tableHead" @saveTableHead="saveTableHead" :tableShowList="tableHeadsListCopy"></table-head>



// methods

 setTableHead() {
   this.tableHeadsListCopy = _.cloneDeep(this.tableHeadsList); // this.tableHeadsList是从后端接口获取的表头数据
   this.$refs.tableHead.isTableHead = true;
 },

createCaption() {
  const caption = document.createElement('caption'); // 创建元素
  caption.innerHTML = '<i class="el-icon-set-up"></i>'; // 图标样式
  document.querySelector('table').appendChild(caption); // 选择table标签并添加caption
  caption.addEventListener('click', () => { // 点击事件
    this.setTableHead();
  });
},

saveTableHead(val) { // 子组件传递过来的保存事件,这里是前端测试版,所以没调用接口
   this.tableHeadsList = [];
   const data = val;
   if (data.every(i => !i.isAuto)) { // 都设定固定宽的话让最后一个表头宽度为自适应
     data[data.length - 1].isAuto = true;
   }
   setTimeout(() => {
     this.tableHeadsList = _.cloneDeep(data);
   });
 },

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-tableel-table-column是Element UI库中的两个组件,用于展示表格数据。自定义指令可以用于对el-tableel-table-column进行扩展和定制。 对于el-table,可以使用自定义指令来实现一些特定的功能,比如自定义排序、拖拽列宽、固定表头等。通过自定义指令,可以在el-table上添加一些额外的行为或样式。 对于el-table-column,可以使用自定义指令来实现一些特定的列样式或行为。比如,可以通过自定义指令来实现某一列的特殊渲染、列宽自适应等功能。 下面是一个示例,展示如何使用自定义指令来扩展el-tableel-table-column: 1. 创建一个自定义指令: ```javascript Vue.directive('my-directive', { bind: function (el, binding, vnode) { // 在绑定时执行的逻辑 // 可以在这里修改el-tableel-table-column的行为或样式 }, inserted: function (el, binding, vnode) { // 在元素插入到DOM时执行的逻辑 }, update: function (el, binding, vnode, oldVnode) { // 在组件更新时执行的逻辑 }, componentUpdated: function (el, binding, vnode, oldVnode) { // 在组件更新完成后执行的逻辑 }, unbind: function (el, binding, vnode) { // 在解绑时执行的逻辑 } }); ``` 2. 在el-tableel-table-column上使用自定义指令: ```html <el-table v-my-directive> <!-- 表格内容 --> </el-table> <el-table-column v-my-directive> <!-- 列内容 --> </el-table-column> ``` 通过上述方式,你可以根据自己的需求来扩展和定制el-tableel-table-column的行为和样式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值