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

yizhihongxing

下面是“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日

相关文章

  • 用ASP.NET实现下载远程图片保存到本地的方法 保存抓取远程图片的方法

    ASP.NET 实现下载远程图片保存到本地的方法 有时候我们需要将远程的图片保存到本地,那么该怎么做呢?下面我们将介绍如何用 ASP.NET 实现下载远程图片并保存到本地的方法。 步骤1:获取远程图片的URL 由于我们需要下载远程图片,所以首先需要获取远程图片的 URL。可以通过爬虫等方式获取,也可以手动输入 URL。 步骤2:下载远程图片 下载远程图片可以…

    css 2023年6月11日
    00
  • CSS使用技巧总结

    CSS使用技巧总结 1. 选择器优化 在CSS样式表中,选择器的出现次数越多,渲染的时间也就越长。因此,为了加快页面的加载速度,需要优化选择器。 1.1. 尽量少使用通用选择器 通用选择器包括 * ,会匹配页面中所有的元素。因此,尽量避免使用通用选择器。 /* bad */ * { margin:0; padding:0; } /* good */ html…

    css 2023年6月9日
    00
  • 解决elementUI 切换tab后 el_table 固定列下方多了一条线问题

    当使用elementUI中的Tabs组件进行Tab切换时,如果其中一个Tab下有一个el-table表格组件且该表格组件使用了固定列功能,那么切换到该Tab后,表格底部会出现一条线,影响了美观度。为了解决这个问题,我们需要使用以下攻略: 第一步:在el-table上设置需要固定的列数 在使用el-table组件时,单元格的宽度都会由表格自身的宽度来决定。同时…

    css 2023年6月9日
    00
  • 移动端网站页面调试的一些经验分享

    下面我将详细讲解“移动端网站页面调试的一些经验分享”的完整攻略。 1. 准备工作 在移动端网站页面调试之前,需要做一些准备工作,包括: 确保开发工具具备模拟移动设备功能; 确认移动设备开启调试模式,并通过USB连接设备与电脑; 在开发工具上打开调试工具。 2. 移动端页面调试方法 在保证准备工作完成之后,我们可以开始移动端页面调试。以下是一些常见的调试方法:…

    css 2023年6月9日
    00
  • CSS 之强制换行技巧

    CSS 之强制换行技巧的详细攻略如下: 1. 强制换行的基本方法 CSS中的 white-space 属性控制空白和文本的处理方式,常见取值有 normal、nowrap和pre等。其中 normal 是默认值,如果需要强制在文本位置加入换行,可以将 white-space 设置为 pre-wrap 或 pre-line。具体方法如下: p { /* 使用p…

    css 2023年6月10日
    00
  • 三步用CSS写一个商城卡券

    以下是关于“三步用CSS写一个商城卡券”的完整攻略,包含两个示例说明。 步骤一:创建HTML结构 首先,需要创建一个HTML结构。可以按照以下步骤操作: 在文本编辑器中创建一个新文件。 在文件中添加以下代码: <div class="coupon"> <div class="coupon-header&quot…

    css 2023年5月18日
    00
  • JS库之Highlight.js的用法详解

    JS库之Highlight.js的用法详解 Highlight.js 是一个轻量级、易于使用且支持语法高亮的 JavaScript 库。它适用于各种开发语言,并且内置大量的代码样式和主题,用户可以自定义自己需要的样式。 安装 安装 Highlight.js 非常简单,可以通过 CDN 或者直接下载源代码来引用。可以在 HTML 文件中直接引用 Highlig…

    css 2023年6月9日
    00
  • 手机网页wap用Bootstrap还是jQuery Mobile

    当需要开发手机网页时,Bootstrap和jQuery Mobile都是常用的响应式前端框架。它们有很多相似之处,但也有一些不同点。在选择使用哪一个前端框架时,需要根据项目的需求和特点来选择。 Bootstrap vs jQuery Mobile Bootstrap Bootstrap是Twitter开发的前端框架,具有以下特点: 响应式设计:可以自适应不同…

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