关于Element UI table 顺序拖动方式

yizhihongxing

关于Element UI table顺序拖动方式,我们需要进行如下步骤:

1. 引入sortablejs和vuedraggable

我们需要先引入sortablejs和vuedraggable这两个库,它们可以帮助我们实现拖拽排序的功能。具体引入方式可以使用CDN或直接下载到本地,这里以使用CDN为例:

<!--引入sortablejs-->
<script src="https://cdn.jsdelivr.net/npm/sortablejs@1.13.0/Sortable.min.js"></script>
<!--引入vuedraggable-->
<script src="https://cdn.jsdelivr.net/npm/vuedraggable@3.1.0/dist/vuedraggable.min.js"></script>

2. 在table中添加vuedraggable组件

接下来,在我们的table中添加<draggable>标签,将v-model绑定到data中的列表,以便在拖拽排序后,数据能够正确反映。

<template>
  <div>
    <el-table :data="tableData">
      <el-table-column type="index"></el-table-column>
      <el-table-column prop="name" label="姓名"></el-table-column>
      <el-table-column prop="age" label="年龄"></el-table-column>
      <el-table-column prop="gender" label="性别"></el-table-column>
      <el-table-column label="操作">
        <template slot-scope="scope">
          <el-button @click="handleEdit(scope.$index)">编辑</el-button>
          <el-button @click="handleDelete(scope.$index)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <draggable v-model="tableData">
      <el-table :data="tableData">
        <el-table-column type="index"></el-table-column>
        <el-table-column prop="name" label="姓名"></el-table-column>
        <el-table-column prop="age" label="年龄"></el-table-column>
        <el-table-column prop="gender" label="性别"></el-table-column>
        <el-table-column label="操作">
          <template slot-scope="scope">
            <el-button @click="handleEdit(scope.$index)">编辑</el-button>
            <el-button @click="handleDelete(scope.$index)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </draggable>
  </div>
</template>

<script>
  import Sortable from 'sortablejs'; // 引入sortablejs库
  import draggable from 'vuedraggable'; // 引入vuedraggable库

  export default {
    data() {
      return {
        tableData: [
          {name: '张三', age: 18, gender: '男'},
          {name: '李四', age: 20, gender: '女'},
          {name: '王五', age: 22, gender: '男'},
        ]
      };
    },
    components: {
      draggable,
      Sortable,
    },
    // ...
  }
</script>

3. 修复拖拽表格中出现的细节问题

在拖拽表格过程中可能会存在一些细节问题,比如拖拽中会出现冒泡事件的问题,需要将其禁止。修复这些问题我们可以在mounted钩子中使用sortablejs,给表格绑定onStartonEnd方法。

<template>
  <div>
    <el-table :data="tableData">
      <el-table-column type="index"></el-table-column>
      <el-table-column prop="name" label="姓名"></el-table-column>
      <el-table-column prop="age" label="年龄"></el-table-column>
      <el-table-column prop="gender" label="性别"></el-table-column>
      <el-table-column label="操作">
        <template slot-scope="scope">
          <el-button @click="handleEdit(scope.$index)">编辑</el-button>
          <el-button @click="handleDelete(scope.$index)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <draggable v-model="tableData" handle=".drag-handle" @start="dragStart" @end="dragEnd">
      <el-table :data="tableData">
        <el-table-column type="index"></el-table-column>
        <el-table-column prop="name" label="姓名"></el-table-column>
        <el-table-column prop="age" label="年龄"></el-table-column>
        <el-table-column prop="gender" label="性别"></el-table-column>
        <el-table-column label="操作">
          <template slot-scope="scope">
            <el-button class="drag-handle" icon="el-icon-s-operation"></el-button>
            <el-button @click="handleEdit(scope.$index)">编辑</el-button>
            <el-button @click="handleDelete(scope.$index)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
    </draggable>
  </div>
</template>

<script>
  import Sortable from 'sortablejs'; // 引入sortablejs库
  import draggable from 'vuedraggable'; // 引入vuedraggable库

  export default {
    data() {
      return {
        tableData: [
          {name: '张三', age: 18, gender: '男'},
          {name: '李四', age: 20, gender: '女'},
          {name: '王五', age: 22, gender: '男'},
        ]
      };
    },
    components: {
      draggable,
      Sortable,
    },
    methods: {
      dragStart(event) {
        event.preventDefault();
        event.stopPropagation();
      },
      dragEnd(event) {
        event.preventDefault();
        event.stopPropagation();
        this.$nextTick(() => {
          this.$refs.table.updateColumns();
        });
      },
      handleEdit(index) {
        console.log('edit', index);
      },
      handleDelete(index) {
        console.log('delete', index);
      },
    },
    mounted() {
      this.$nextTick(() => {
        const handle = '.drag-handle';
        const el = document.querySelector('.el-table__body-wrapper tbody');
        const sortable = Sortable.create(el, {
          handle,
          onStart: evt => {
            evt.preventDefault();
            evt.stopPropagation();
          },
          onEnd: evt => {
            evt.preventDefault();
            evt.stopPropagation();
            this.$nextTick(() => {
              this.$refs.table.updateColumns();
            });
          },
        });
      });
    },
  }
</script>

示例说明

下面举两个例子说明:

  1. 拖拽排序后,将结果显示在控制台中,代码如下:
<template>
  <div>
    <draggable v-model="tableData">
      <el-table :data="tableData">
        <el-table-column type="index"></el-table-column>
        <el-table-column prop="name" label="姓名"></el-table-column>
        <el-table-column prop="age" label="年龄"></el-table-column>
        <el-table-column prop="gender" label="性别"></el-table-column>
      </el-table>
    </draggable>
    <el-button @click="printData">打印数据</el-button>
  </div>
</template>

<script>
  import draggable from 'vuedraggable';

  export default {
    data() {
      return {
        tableData: [
          {name: '张三', age: 18, gender: '男'},
          {name: '李四', age: 20, gender: '女'},
          {name: '王五', age: 22, gender: '男'},
        ]
      };
    },
    components: {
      draggable,
    },
    methods: {
      printData() {
        console.log(this.tableData);
      },
    },
  }
</script>
  1. 拖拽排序后,重新渲染表格,代码如下:
<template>
  <div>
    <draggable v-model="tableData" @change="reRenderTable">
      <el-table :data="tableData">
        <el-table-column type="index"></el-table-column>
        <el-table-column prop="name" label="姓名"></el-table-column>
        <el-table-column prop="age" label="年龄"></el-table-column>
        <el-table-column prop="gender" label="性别"></el-table-column>
      </el-table>
    </draggable>
    <el-button @click="printData">打印数据</el-button>
  </div>
</template>

<script>
  import draggable from 'vuedraggable';

  export default {
    data() {
      return {
        tableData: [
          {name: '张三', age: 18, gender: '男'},
          {name: '李四', age: 20, gender: '女'},
          {name: '王五', age: 22, gender: '男'},
        ]
      };
    },
    components: {
      draggable,
    },
    methods: {
      reRenderTable() {
        this.$nextTick(() => {
          this.$refs.table.$children.forEach(child => {
            child.$forceUpdate();
          });
        });
      },
      printData() {
        console.log(this.tableData);
      },
    },
  }
</script>

以上就是关于Element UI table顺序拖动方式的详细攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Element UI table 顺序拖动方式 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 为Vue3 组件标注 TS 类型实例详解

    为Vue3组件标注TS类型实例详解, 为什么要在Vue3中为组件标注TS类型 Vue3已经全面拥抱TypeScript,Vue2中虽然也可以使用TypeScript,但是不如在Vue3中使用简单直观。为Vue3中的组件标注TS类型能够帮助我们减少代码出错的可能性,能够在开发阶段就发现类型不匹配的问题。因为标注了TS类型,编辑器也可以给我们更好的编码体验,例如…

    Vue 2023年5月27日
    00
  • Vue中Vue.extend()的使用及解析

    下面我将详细介绍Vue中Vue.extend()的使用及解析的完整攻略。 1. Vue.extend()的作用 在Vue中,我们经常需要生成一个组件,并将其作为另一个组件的子组件来使用。Vue.extend()方法就是为了方便我们定义和注册组件而存在的。 它的作用是基于Vue构造函数,创建一个“子类”,即一个可以被Vue组件系统识别的组件构造函数。通过ext…

    Vue 2023年5月28日
    00
  • vue 调用 RESTful风格接口操作

    当我们使用 Vue 时,通常需要在前端与服务器端进行数据交互。RESTful 风格接口是一种比较常用的数据交互方式。本文将为您讲解如何在 Vue 中使用 RESTful 风格接口调用操作。 准备工作 在使用 RESTful 风格接口之前,需要安装 axios。axios 是一个优秀的 HTTP 客户端,可以用于发送异步请求并处理响应。可以使用 npm 进行安…

    Vue 2023年5月28日
    00
  • vue-cli2 构建速度优化的实现方法

    针对“vue-cli2 构建速度优化的实现方法”的完整攻略,我可以为你提供以下几个步骤: 1. 使用线程池 在项目目录下的build/webpack.base.conf.js文件中,我们可以使用thread-loader来开启线程池,将耗时的操作放置在子进程中进行提高构建速度。 // … const threadLoader = require(‘thr…

    Vue 2023年5月28日
    00
  • Vue精简版风格概述

    Vue精简版风格概述 什么是Vue精简版风格? Vue精简版风格是使用Vue框架开发大型Web应用程序的一种设计风格。它强调组件化和功能模块化,以简化应用程序代码的维护和扩展。 Vue精简版风格的设计原则 Vue精简版风格的设计原则包括: 单一职责原则:每个组件只负责一个功能。 组件化:将UI和业务逻辑封装为组件。 功能模块化:将应用程序分解成功能模块,每个…

    Vue 2023年5月27日
    00
  • vue 使用el-table循环轮播数据列表的实现

    下面是详细讲解“vue 使用el-table循环轮播数据列表的实现”的完整攻略。 Vue中使用El-table渲染数据 在Vue中,可以使用Element UI提供的表格组件el-table来渲染数据列表。el-table非常适用于多种不同的场景,包括但不限于数据展示、数据分页、搜索等等,而且具有非常丰富的功能和定制化选项。 要使用el-table渲染数据列…

    Vue 2023年5月29日
    00
  • Vue安装浏览器开发工具的步骤详解

    下面是“Vue安装浏览器开发工具的步骤详解”攻略: 1. 前置条件 在安装Vue的浏览器开发工具之前,需要确保以下两个条件已经满足:1. 拥有安装Vue的基础,可以使用npm命令行在终端中安装Vue.js。2. 时间充足,可以耐心地按照以下详细步骤进行操作。 2. 安装Vue的浏览器开发工具 2.1. 安装Vue.js开发工具:Vue Devtools Vu…

    Vue 2023年5月27日
    00
  • Vue3 构建 Web Components使用详解

    Vue3 构建 Web Components使用详解 Web Components 是一种新的 Web 技术,它可以让 Web 开发者更加灵活地创建自定义标签,实现跨框架、跨库的组件化开发。Vue3 作为当前最流行的前端框架之一,也支持使用 Web Components 扩展其功能。 什么是 Web Components Web Components 是一种…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部