关于Element UI table 顺序拖动方式

关于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日

相关文章

  • vue2.0实战之基础入门(1)

    “vue2.0实战之基础入门(1)”是一篇介绍Vue.js基础知识的文章。文章主要分为以下几个部分: 1. 前言 该部分主要介绍了Vue.js的优点和适用场景,并介绍了本文的主要内容和学习目标。 2. Vue.js基础入门 该部分主要介绍了Vue.js的基础入门,包括: 2.1 Vue.js介绍 介绍了Vue.js的概念、特点和优势,并对Vue.js与其他框…

    Vue 2023年5月27日
    00
  • Vue下的国际化处理方法

    下面我将为你详细讲解Vue下的国际化处理方法。 什么是Vue国际化 Vue国际化是指将应用程序的文本和其他可本地化内容(例如日期、时间、货币、图片、数字等)自动翻译成用户的首选语言或区域设置的过程。在Vue中,可以使用Vue-i18n插件轻松实现国际化。Vue-i18n是一种提供文本翻译和本地化方案的Vue插件。 安装Vue-i18n 在Vue项目中安装Vu…

    Vue 2023年5月28日
    00
  • vue cli 全面解析

    Vue CLI 全面解析 什么是Vue CLI Vue CLI是一个基于Vue.js进行快速开发的标准化工具,提供了快速生成Vue项目的能力,对于开发和构建大型Vue.js应用非常有帮助。它包含了一套插件和预设,可以让你在几分钟内即可创建Vue项目,配置工具链。 安装Vue CLI 要安装Vue CLI,我们首先需要安装Node.js。我们可以去Node.j…

    Vue 2023年5月27日
    00
  • 一篇文章带你搞懂VUE基础知识

    一篇文章带你搞懂VUE基础知识攻略 简介 Vue.js 是一个轻量级的渐进式 JavaScript 框架,用于构建交互式的前端用户界面。本文的目的是通过简单易懂的方式,帮助初学者快速了解 Vue.js 的基础知识。 前置知识 HTML 基础知识 JavaScript 基础知识 安装 Vue.js 可以通过 CDN 直接引入,也可以通过 NPM 安装。 CDN…

    Vue 2023年5月27日
    00
  • 用electron 打包发布集成vue2.0项目的操作过程

    下面是用Electron打包发布集成Vue2.0项目的操作过程的完整攻略,包括以下步骤: 1. 创建Vue2.0项目 首先,我们需要使用Vue CLI创建一个Vue2.0项目。如果您还没有安装Vue CLI,请先使用以下命令进行安装: npm install -g @vue/cli 然后,使用以下命令创建项目: vue create my-project 其…

    Vue 2023年5月28日
    00
  • Vue3 computed初始化获取设置值实现示例

    首先,让我们了解Vue3中computed的使用方式。 在Vue3中,computed不再是选项,它变成了函数。 计算属性的本质仍然是基于依赖项进行缓存的值,但现在您必须显式地自定义getter和setter函数。 创建Computed属性 要创建计算属性,请将一个函数传递给computed()函数。该函数被定义为getter函数,在计算属性的依赖项发生更改…

    Vue 2023年5月28日
    00
  • vue项目中使用require.context引入组件

    Vue项目中使用require.context引入组件可以方便我们快速地载入一批组件,特别是在开发大型项目时,能够大大提高效率。下面是具体的步骤: 安装依赖 首先,我们需要安装babel-plugin-require-context-hook插件来解析使用require.context方法引入的组件。在项目根目录下执行以下命令: npm install ba…

    Vue 2023年5月28日
    00
  • vue滚动插件better-scroll使用详解

    Vue 滚动插件 Better-Scroll 使用详解 插件介绍 Better-Scroll 是一款使用原生 JS 实现的插件,专门用于创建滚动效果的插件。 支持 Vue、React、Angular 等主流框架。 优点: 轻量、流畅、具有很好的兼容性、可以自定义样式和配置。 安装 可以使用 npm 安装 Better-Scroll 。 npm install…

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