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日

相关文章

  • IE7与web标准设计(3)

    IE7与web标准设计是一个非常重要的话题。在IE6时代,许多网页设计者都习惯于使用一些IE6专有的CSS属性和HTML标签来实现一些特定的效果。但这导致网页在非IE6浏览器下的兼容性问题严重,也使得整个web对标准的支持受到限制。随着IE7的出现,微软开始认真推动web标准的实现,导致IE7对于许多IE6专有的属性和标签的支持度有所下降。因此,为了让网页在…

    css 2023年6月9日
    00
  • CSS3制作气泡对话框的实例教程

    下面是“CSS3制作气泡对话框的实例教程”完整攻略: 准备工作 在制作气泡对话框之前,需要准备好以下材料: HTML文件 CSS3样式表 其中,HTML文件涉及到两个必要的元素:气泡和对话框。气泡可以使用一个div元素,对话框则可以使用html中的多个元素(如h1、p、img等)。 制作气泡 可以使用CSS3的伪元素before和after来制作气泡。其中,…

    css 2023年6月10日
    00
  • CSS3中border-radius属性设定圆角的使用技巧

    来详细讲解一下“CSS3中border-radius属性设定圆角的使用技巧”的完整攻略。 1. border-radius属性介绍 border-radius是CSS3新增的属性,用来设置圆角。它的语法如下: border-radius: 10px; /* 四个方向都设置10像素的圆角 */ border-radius: 10px 0 10px 0; /* …

    css 2023年6月10日
    00
  • CSS 之margin知识点(必看)

    CSS之margin知识点(必看) 在CSS中,margin是一个常用的样式属性,它可以设置元素的外边距。然而,在实际开发中,可能会遇到一些坑,例如外边距合并、负外边距等问题。本攻略将详细讲解CSS之margin知识点,包括基本用法、注意项和示例说明。 1. 基本用法 在CSS中,可以使用margin属性来设置元素的外边距。margin属性可以设置四个方向的…

    css 2023年5月18日
    00
  • 详解CSS文件的三种引入方式

    下面是详解CSS文件的三种引入方式的完整攻略: 1. 外部样式表 使用外部样式表是把CSS规则写在一个独立的外部文件中,然后在HTML文件中通过\元素来引用。这种方式具有以下优点:- 可以将CSS样式从HTML文档中分离出来,降低文档复杂度,方便管理和维护。- 外部文件可以被多个HTML页面引用,可以有效地减少页面体积和提高重复利用率。 外部样式表的语法如下…

    css 2023年6月9日
    00
  • css3 实现滚动条美化效果的实例代码

    下面是关于实现CSS3滚动条美化效果的攻略,其中包含两个示例说明。 1. 攻略 1.1 首先,了解滚动条的样式 在CSS3中,可以通过::-webkit-scrollbar伪元素来修改滚动条的样式。可以使用以下属性: width – 滚动条宽度 height – 滚动条高度 background – 背景颜色 border – 边框样式 border-rad…

    css 2023年6月10日
    00
  • HTML标题标签(h1 到 h6)使用方法

    HTML 标题标签 (<h1> 到 <h6>) 是用于为文档或页面的不同部分创建标题的标记。它们被设计为在页面上显示重要性不同的标题元素。 <h1> 标题是最高级别的标题,也是最重要的标题,应该在页面上作为主标题出现。相反, 标题是最低级别的标题,也是最不重要的标题,应该在页面上出现作为辅助标题。 使用方法 <h1&…

    Web开发基础 2023年3月15日
    00
  • CSS3实现时间轴特效

    下面是详细的“CSS3实现时间轴特效”的完整攻略: 步骤1:HTML结构和基本样式的创建 首先,我们需要搭建时间轴结构的HTML。一般来说,时间轴的结构可以使用ul列表方式进行创建。在ul中,我们需要添加相应的li元素,以及相关的div和p标签,根据需要可以更改样式。此外,在创建时间轴之前,我们还需要先行创建相关的基本样式,如下: .container { …

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