【vue+element-plus】拖动表格头排序功能

本文介绍了如何使用Vue.js和Element Plus库,结合sortablejs插件,实现表格头拖动排序功能。详细讲解了安装插件、编写util文件和组件的步骤,并提到了参考的相关文章。
摘要由CSDN通过智能技术生成

预览效果

在这里插入图片描述

功能描述
最近在做一个功能,要求是鼠标拖动表格头,实现表格列的排序。刚开始去elementUI看了下官方文档,发现没有这个功能,所以百度搜了一下,发现有一个插件可以实现: sortablejs

代码实现

安装插件
npm install sortablejs --save
代码部分
util文件
//移动数组元素至某个指定位置
export function moveArr(arr, newIndex, oldIndex) {
    // console.log('arr', arr, oldIndex, newIndex);
    arr.splice(newIndex, 0, arr.splice(oldIndex, 1)[0])
        /** splice 会更改原来数组的数据 */
        /**  list.splice(oldIndex, 1)[0] 删除旧数据位置返回删除的数据 */
        /** list.splice(newIndex, 0, old)  相当于把删除的旧数据插入到新的位置上去 */
}
组件
<template>
  <el-table :data="tableData" @sort-change="sortMethods" @selection-change="handleSelectionChange" border >
    <el-table-column type="index" label="序号" width="55" align="center"></el-table-column>
    <el-table-column type="selection" label="勾选"></el-table-column>
    <el-table-column
      v-for="(item, index) in tableHeader"
      :label="item.label"
      :type="item.type"
      :width="item.width"
      :sortable="item.sort"
      :key="index + '' + Math.random()"
      show-overflow-tooltip
      align="center"
    >
      <!-- 自定义表格头部插槽 -->
      <!-- <template #header="{column, $index }">
                            <span>{{ column }}}</span>
                        </template> -->
      <!-- 表格体内容显示插槽 -->
      <template #default="{ row, column, $index }">
        <span v-if="item['showType'] == 'text'">
          {{ row[item.prop] }}
        </span>
        <span v-else-if="item['showType'] == 'sex'">
          {{ row.sex === "F" ? "女" : "男" }}
        </span>
        <span v-else-if="item['showType'] == 'status'">
          {{ row.status == "1" ? "开心" : "郁闷" }}
        </span>
      </template>
    </el-table-column>
  </el-table>
</template>

<script>
//导入定义的方法
import { moveArr } from '@/utils/util'
// 导入插件
import Sortable from 'sortablejs';
export default {
  name: "zan",
  data() {
    return {
      //表格头
      tableHeader:[
        {
          label:'姓名',
          prop:'name',
          showType:'text',
          width:'',
          sort:false
        },
        {
          label:'年龄',
          prop:'age',
          showType:'text',
          width:'',
          sort:true
        },
        {
          label:'爱好',
          prop:'hobby',
          showType:'text',
          width:'',
          sort:false
        },
        {
          label:'电话',
          prop:'phone',
          showType:'text',
          width:'',
          sort:true
        },
        {
          label:'性别',
          prop:'sex',
          showType:'sex',
          width:'',
          sort:false
        },
        {
          label:'心情',
          prop:'status',
          showType:'status',
          width:'',
          sort:false
        },
      ],
      //表格数据
      tableData:[
        {
          name:'jack',
          age:18,
          hobby:'篮球',
          phone:1239742,
          sex:'M',
          status:0
        },
        {
          name:'娜娜',
          age:16,
          hobby:'跳',
          phone:13745134,
          sex:'F',
          status:1
        },
        {
          name:'你干嘛~',
          age:24,
          hobby:'rap',
          phone:5201413,
          sex:'M',
          status:1
        },
      ],

    };
  },
  mounted(){
    this.dragSort();
    this.columnDrop();
  },
  methods: {
    //行拖拽
    dragSort() {
            let that = this;
            // 首先获取需要拖拽的dom节点
            const el1 = document.querySelectorAll('.el-table__body-wrapper')[0].querySelectorAll('table > tbody')[0];
            Sortable.create(el1, {
                disabled: false, // 是否开启拖拽
                ghostClass: 'sortable-ghost', //拖拽样式
                animation: 150, // 拖拽延时,效果更好看
                group: { // 是否开启跨表拖拽
                    pull: false,
                    put: false
                },
                onEnd: (e) => {
                    // 这里主要进行数据的处理,拖拽实际并不会改变绑定数据的顺序,这里需要自己做数据的顺序更改
                    console.log(e);
                }
            });
        },
        //列拖拽
    columnDrop() {
            const wrapperTr = document.querySelector('.el-table__header-wrapper tr')
            this.sortable = Sortable.create(wrapperTr, {
                animation: 180,
                delay: 0,
                onEnd: evt => {
                    console.log(evt.oldIndex,evt.newIndex);
                    if (evt.oldIndex === evt.newIndex) return;
                    //表头排序
                    // 这里-2是因为表格头前两列是上面HTML中自己定义的序号列和勾选列,tableHeader数据中没有定义该两列,所以操作数组的时候要排除掉这两项
                    moveArr(this.tableHeader, evt.newIndex-2, evt.oldIndex-2)
                    // const oldItem = this.tableHeader[evt.oldIndex];
                    // const newItem = this.tableHeader[evt.newIndex];
                    // this.$set(this.columnsConfig, evt.newIndex, oldItem);
                    // this.$set(this.columnsConfig, evt.oldIndex, newItem);
                }
            })
        },
        // 列数据排序
        sortMethods(type) {
            console.log(type);
        },
        //勾选的数据
        handleSelectionChange(row) {
          console.log(row);
        },
  },
};
</script>

<style scoped>
</style>

参考文章

element-ui table 表格组件实现可拖拽效果(行、列)
js 数组移动位置算法

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现列拖拽功能可以使用 SortableJS 库,并结合 Element Plus 的表格组件和 Vue3 的响应式数据。 首先需要在项目中安装 SortableJS: ``` npm install sortablejs --save ``` 然后在需要使用的组件中引入 SortableJS 和 Element Plus 的表格组件: ```javascript import Sortable from 'sortablejs'; import { ElTable, ElTableColumn } from 'element-plus'; ``` 接着,在组件中定义表格数据和表格列,以及拖拽回调函数: ```javascript export default { data() { return { tableData: [ { name: 'John', age: 20, address: 'New York' }, { name: 'Tom', age: 25, address: 'London' }, { name: 'Lucy', age: 18, address: 'Paris' }, { name: 'Lily', age: 22, address: 'Tokyo' } ], tableColumns: [ { label: 'Name', prop: 'name' }, { label: 'Age', prop: 'age' }, { label: 'Address', prop: 'address' } ] }; }, mounted() { // 绑定拖拽回调函数 const el = this.$refs.table.$el.querySelector('.el-table__body-wrapper tbody'); Sortable.create(el, { animation: 150, onEnd: evt => { const { newIndex, oldIndex } = evt; const item = this.tableColumns.splice(oldIndex - 1, 1)[0]; this.tableColumns.splice(newIndex - 1, 0, item); } }); }, render() { return ( <ElTable ref="table" data={this.tableData}> {this.tableColumns.map(column => ( <ElTableColumn label={column.label} prop={column.prop}></ElTableColumn> ))} </ElTable> ); } }; ``` 这里使用 `Sortable.create` 方法创建一个拖拽对象,并且绑定了 `onEnd` 回调函数,当拖拽结束后,将表格列数组中的相应元素移动到新位置。 最后渲染表格时,使用 `map` 方法动态创建表格列。 这样就实现了列拖拽功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值