vue+element-ui+sortable.js实现表格拖拽功能

下面是“vue+element-ui+sortable.js实现表格拖拽功能”的完整攻略:

需要使用的框架或插件

  • vue.js
  • element-ui
  • sortable.js

实现步骤

1. 安装依赖

npm install vue-element-ui sortablejs --save

2. 引入依赖

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import Sortable from 'sortablejs'

Vue.use(ElementUI)
Vue.prototype.$Sortable = Sortable  // 注册Sortable为Vue的全局指令

3. 实现表格拖拽

HTML结构

<template>
  <div>
    <el-table :data="tableData" ref="table" @sort-change="handleSortChange">
      <el-table-column prop="name" label="姓名"></el-table-column>
      <el-table-column prop="age" label="年龄"></el-table-column>
      <el-table-column prop="address" label="地址"></el-table-column>
    </el-table>
  </div>
</template>

JS代码

export default {
  data() {
    return {
      tableData: [
        { name: '张三', age: 18, address: '北京' },
        { name: '李四', age: 23, address: '上海' },
        { name: '王五', age: 32, address: '广州' },
        { name: '赵六', age: 45, address: '深圳' },
      ]
    }
  },
  mounted() {
    const el = this.$refs.table.$el.querySelector('.el-table__body-wrapper tbody')
    this.$Sortable.create(el, {
      // options
      onEnd: evt => {
        // 拖拽结束后更新数据
        const oldIndex = evt.oldIndex
        const newIndex = evt.newIndex
        const item = this.tableData.splice(oldIndex, 1)[0]
        this.tableData.splice(newIndex, 0, item)
      }
    })
  },
  methods: {
    handleSortChange({ oldIndex, newIndex }) {
      // ElementUI的sort-change事件需要删除,否则拖拽会发生两次
      this.$refs.table.$el.querySelector('.el-table__body-wrapper tbody').addEventListener('dragover', e => e.preventDefault())
      this.$refs.table.$el.querySelector('.el-table__body-wrapper tbody').removeEventListener('drop', this.handleSortChange)

      // ElementUI的sort-change事件会导致表格数据重排,需改为在Sortable的onEnd回调中更新表格数据
      const item = this.tableData.splice(oldIndex, 1)[0]
      this.tableData.splice(newIndex, 0, item)
    }
  }
}

示例说明

示例1:禁用弹出编辑框和排序功能

在实际业务中可能会遇到需要禁用表格拖拽或编辑功能的情况,可以通过给表格添加class或props属性来实现。

<template>
  <div>
    <el-table
      :data="tableData"
      ref="table"
      class="table-noninteractive"  <!-- 禁用表格拖拽 -->
      :show-header="false"  <!-- 禁用表格排序 -->
    >
      <!-- ... -->
    </el-table>
  </div>
</template>
/* 禁用表格样式 */
.table-noninteractive td { pointer-events: none; }
.table-noninteractive .el-table__header-wrapper th { pointer-events: none; }

示例2:禁用单行排序

有时候不希望表格中的某些行可以排序,可以通过v-for的index属性来实现。

<template>
  <div>
    <el-table :data="tableData" ref="table">
      <el-table-column v-for="(item, index) in tableData" :key="item.id" :label="item.name">
        <template v-slot="scope">
          <span v-if="index === 0">{{ scope.row.age }}</span>
          <span v-else>{{ scope.row.address }}</span>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>
export default {
  data() {
    return {
      tableData: [
        { id: 1, name: '张三', age: 18, address: '北京', sortable: true },
        { id: 2, name: '李四', age: 23, address: '上海', sortable: false },
        { id: 3, name: '王五', age: 32, address: '广州', sortable: true },
        { id: 4, name: '赵六', age: 45, address: '深圳', sortable: true },
      ]
    }
  },
  mounted() {
    const el = this.$refs.table.$el.querySelector('.el-table__body-wrapper tbody')
    this.$Sortable.create(el, {
      // options
      onEnd: evt => {
        const oldIndex = evt.oldIndex
        const newIndex = evt.newIndex
        const item = this.tableData.splice(oldIndex, 1)[0]

        // 如果当前行的sortable属性为false,则不允许排序
        if (this.tableData[newIndex].sortable) {
          this.tableData.splice(newIndex, 0, item)
        } else {
          this.tableData.splice(oldIndex, 0, item)
        }
      }
    })
  }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue+element-ui+sortable.js实现表格拖拽功能 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 网页设计制作试题及参考答案

    以下是关于“网页设计制作试题及参考答案”的完整攻略: 一、准备工作 在开始制作前,我们需要完成以下几项准备工作: 确定设计风格和色彩搭配。 收集所需图片、文字等素材,并做好备份。 确定使用的网页制作软件,如Adobe Dreamweaver、Sublime Text等。 二、开始制作 下面是步骤: 1. 创建基础文件结构 在编辑器中新建HTML文件,并加入以…

    css 2023年6月9日
    00
  • HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)

    下面我将详细讲解 HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO) 的完整攻略。 1. 理解需求和设计思路 首先要明确需求,该动画效果是实现一个具有切换效果的 TAB 栏,可以通过点击 TAB 来切换不同的内容。 设计思路: 使用 HTML 的 ul 和 li 标签来构建基本的 TAB 栏结构 使用 CSS3 实现动画效果 使用 JavaS…

    css 2023年6月9日
    00
  • android计算pad或手机的分辨率/像素/密度/屏幕尺寸/DPI值的方法

    让我来详细讲解一下“android计算pad或手机的分辨率/像素/密度/屏幕尺寸/DPI值的方法”的完整攻略。 1. 分辨率和像素 在Android设备上,分辨率和像素是经常被用到的术语。分辨率可以理解为屏幕分辨率,是指屏幕上横向和纵向的像素点数。例如,720×1280像素的屏幕分辨率意味着宽度为720像素,高度为1280像素。 那么像素是什么呢? 像素是显…

    css 2023年6月9日
    00
  • jQuery中事件与动画的总结分享

    来为大家详细讲解“jQuery中事件与动画的总结分享”的完整攻略。 前言 在前端开发中,常常需要使用到 jQuery 来制作动态交互效果。而 jQuery 中的事件与动画则是制作动态交互效果的重要组成部分。因此,了解 jQuery 中事件与动画的基本用法及其应用场景就显得尤为重要了。 事件 绑定事件 我们可以使用 jQuery 的 on() 方法来为 HTM…

    css 2023年6月9日
    00
  • PS历经25年,最好用的免费PS插件统计

    PS(Photoshop)是目前最为流行的图像处理软件之一,它的强大功能得益于丰富的插件资源。为让大家更好地了解PS插件,本文将分享最好用的免费PS插件以及如何安装使用。 一、免费PS插件推荐 1. Camera Raw 相机原始文件是一种未经处理的照片格式,需要PS插件才能打开和编辑。作为Adobe官方出品的插件,Camera Raw可识别各种相机品牌的原…

    css 2023年6月11日
    00
  • 浅谈css网页的几种布局

    浅谈CSS网页的几种布局 在进行网页布局时,CSS提供了多种方式,下面将详细讲解 css 网页的几种布局以及两个示例。 流式布局 流式布局是一种基于百分比的布局方式,会根据浏览器窗口的大小来调整页面的尺寸。 关键属性:- width: 百分比宽度 优点:- 兼容性好- 页面可以随着窗口大小调整自适应- 对SEO友好 缺点:- 页面元素不能做到完全固定- 当窗…

    css 2023年6月9日
    00
  • CSS 选择所有子元素添加样式的方法

    当需要为某个元素下的所有子元素添加样式时,可以使用CSS通配符和后代选择器共同实现。具体步骤如下: 步骤一:通过后代选择器选中父元素 在CSS文件中使用后代选择器来选中父元素,语法格式为”父元素 子元素”。例如,如果想为body元素下的所有子元素添加样式,可以这样写: body * { /* 添加的样式代码 */ } 在上述代码中,body *的意思是选中b…

    css 2023年6月9日
    00
  • JavaFX实现UI美观效果代码实例

    针对“JavaFX实现UI美观效果代码实例”的完整攻略,我准备了以下内容: 1. 环境准备 在开始使用JavaFX实现UI美观效果之前,需要先安装好JavaFX开发环境,确保电脑上已经安装了JavaFX SDK和Java SDK,并且已经配置好了JavaFX和Java的环境变量。如果还没有安装和配置,可以参考JavaFX官方文档中的[安装和配置](https…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部