当前位置: 代码网 > it编程>前端脚本>Vue.js > Vue3+El-Plus实现表格行拖拽功能完整代码

Vue3+El-Plus实现表格行拖拽功能完整代码

2024年05月26日 Vue.js 我要评论
一: 安装sortablejsnpm install sortablejs --save二: 页面使用这里项目只需要一个地方用到,就没有封装成组件,直接在用到的.vue文件中写了。在使用的 .vue

一: 安装sortablejs

npm install sortablejs --save

二: 页面使用

这里项目只需要一个地方用到,就没有封装成组件,直接在用到的.vue文件中写了。

在使用的 .vue 文件中导入

import { default as sortable, sortableevent } from "sortablejs";

看下图: 

注意事项:el-table需要配置  row-key 且保持唯一性,不然会出现排序不对的情况

rowdrag方法:

// 行拖拽
const rowdrag = function () {
  // 要拖拽元素的父容器
  const tbody = document.queryselector(
    ".draggable .el-table__body-wrapper tbody"
  );
  if (!tbody) return;
  sortable.create(tbody as htmlelement, {
    //  可被拖拽的子元素
    draggable: ".draggable .el-table__row",
    onend(event: sortableevent) {
      if (event.oldindex !== undefined && event.newindex !== undefined) {
        const currrow = tablelist.splice(event.oldindex, 1)[0];
        tablelist.splice(event.newindex, 0, currrow);
      }
    },
  });
};

效果如下:

图标不能使用,自己可以更换了,这个无所谓啦。

三 : 下面是封装成组件使用

还不够完善,可以根据自己的需求进行修改。

dragtable  组件代码如下:

<template>
  <div class="t-table" ref="table_ref">
    <el-table
      class="draggable"
      ref="tables"
      :data="state.tabledata"
      row-key="id"
      border
      fit
      highlight-current-row
      style="width: 100%"
    >
      <!-- 拖拽 -->
      <el-table-column align="center" label="" width="80">
        <template #default="{}">
          <i-ep-fold style="cursor: move" />
        </template>
      </el-table-column>
      <template v-for="item in state.tableheaders" :key="item.id">
        <el-table-column
          :property="item.property"
          :min-width="item.width"
          align="center"
          show-overflow-tooltip
        >
          <template #header>
            <p style="margin: 0; display: flex; justify-content: center">
              {{ item.label }}
            </p>
          </template>
        </el-table-column>
      </template>
    </el-table>
  </div>
</template>
<script setup lang="ts" name="dragtable">
import { ref, watch, reactive, onmounted } from "vue";
import { default as sortable, sortableevent } from "sortablejs";
const props = defineprops<{
  // 列表数据
  table: any;
  // 表头数据
  headers: {
    id: string;
    property: string;
    width: string;
    label: string;
    show: boolean;
  }[];
}>();
// 初始化数据
const state = reactive({
  tabledata: props.table,
  tableheaders: props.headers,
});
// 获取el-table ref
const tables: any = ref<htmlelement | null>(null);
// 获取t-table ref
const table_ref: any = ref<htmlelement | null>(null);
// 抛出事件 在 应用的.vue 文件做相应的操作
const emits = defineemits(["rowsort"]);
// 监听移动的 表格数据 重新赋值
watch(
  () => props.table,
  (val) => {
    console.log("watch val", val);
    state.tabledata = val;
  },
  { deep: true }
);
onmounted(() => {
  console.log("state.tabledata >>>", state.tabledata);
  console.log("state.tableheaders >>>", state.tableheaders);
  initsort();
});
// 行拖拽
const initsort = () => {
  const el = table_ref.value.queryselector(".el-table__body-wrapper tbody");
  // console.log('3333', el)
  sortable.create(el, {
    animation: 150, // 动画
    onend: (event: sortableevent) => {
      if (event.oldindex !== undefined && event.newindex !== undefined) {
        const currow = state.tabledata.splice(event.oldindex, 1)[0];
        state.tabledata.splice(event.newindex, 0, currow);
        emits("rowsort", state.tabledata);
      }
    },
  });
};
</script>

 在 .vue 文件中的使用 及 页面父传子的数据

1. 导入组件

import dragtable from "@/components/dragtable/index.vue";

2. 使用组件

<dragtable
  :table="tablelist"
  :headers="initialheaders"
  @rowsort="handlerowsort"
/>

3. 在 .vue 文件里的数据及方法

列表数据就根据自己后端返回的数据直接传递就行。

表头数据如下:

let initialheaders = reactive([
  {
    id: "1",
    property: "id",
    width: "88",
    label: "id",
    show: true,
  },
  {
    id: "2",
    property: "name",
    width: "121",
    label: "111",
    show: true,
  },
  {
    id: "3",
    property: "thumb",
    width: "139",
    label: "222",
    show: true,
  },
  {
    id: "4",
    property: "icon",
    width: "99",
    label: "333",
    show: true,
  },
]);

handlerowsort() 这个事件每次更改列表的排序就会触发,在使用组件的 .vue 文件上就能进行一些相应的需求操作

const handlerowsort = () => {
  console.log("应用的.vue 文件做相应的操作");
};

组件使用的效果图如下:

样式可以根据自己需求进行调整,这个小问题啦,功能实现就好。

总结

到此这篇关于vue3+el-plus实现表格行拖拽功能的文章就介绍到这了,更多相关vue3+el-plus表格行拖拽功能内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com