vue2中,使用sortablejs组件和vuedraggable实现拖拽排序功能

1、基本介绍

Sortable.js是一款优秀的js拖拽库,支持ie9及以上版本ie浏览器和现代浏览器,也可以运行在移动触摸设备中。不依赖jQuery。支持 Meteor、AngularJS、React、Vue、Knockout框架和任何CSS库,如Bootstrap、Element UI。你可以用来拖拽div、table等元素。

官网:http://www.sortablejs.com/

npm官网:https://www.npmjs.com/package/sortablejs

api配置项:http://www.sortablejs.com/options.html

中文文档:https://www.itxst.com/sortablejs/neuinffi.html

github地址:https://github.com/SortableJS/Vue.Draggable

vuedraggable地址:https://github.com/SortableJS/Vue.Draggable

demo1:https://sortablejs.github.io/Vue.Draggable/#/table-example

demo2:https://david-desmaisons.github.io/draggable-example/

安装

yarn add vuedraggable

npm i -S vuedraggable
2、基础示例

示例

<draggable v-model="myArray" group="people" @start="drag=true" @end="drag=false">
   <div v-for="element in myArray" :key="element.id">{{element.name}}</div>
</draggable>

<script>
import draggable from 'vuedraggable'
  export default {
        components: {
            draggable,
        },
}
</script>

基础示例-div

<div id="itxst">
    <div data-id="1">item 1</div>
    <div data-id="2">item 2</div>
    <div data-id="3">item 3</div>
</div>
<script>
    //获取对象
    var el = document.getElementById('itxst');
    //设置配置
    var ops = {
        animation: 1000,
        //拖动结束
        onEnd: function (evt) {
            console.log(evt);
            //获取拖动后的排序
            var arr = sortable.toArray();
            alert(JSON.stringify(arr));
        },};
    //初始化
    var sortable = Sortable.create(el, ops);
</script>

基础示例-表格

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>sortable.js table表格拖拽例子</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, minimal-ui">
     <script src="https://www.itxst.com/package/sortable/sortable.min.js"></script> 
</head>
<body>
    <table id="itxst">
        <tbody>
            <tr>
                <td>1</td>
                <td>www.baidu.com</td>
            </tr>
        </tbody>
        <tbody>
            <tr>
                <td>2</td>
                <td>www.itxst.com</td>
            </tr>
        </tbody>
    </table>
    <script>
        //获取对象
        var el = document.getElementById('itxst');
        //设置配置
        var ops = { animation: 1000 };
        //初始化
        var sortable = Sortable.create(el, ops);
    </script>
</body>
</html>
3、应用实例

场景:需要对表格数据进行拖拽排序

1、安装

npm install sortablejs --save

2、引入

import Sortable from 'sortablejs'

3、使用

使用的vue + element

3.1、在 el-tabl 内添加ref,方便我们获取节点

<el-table ref="dragTable" :data="listdata" border style="width: 100%">

3.2、编写拖拽的方法

setSort() {
  const el = this.$refs.dragTable.$el.querySelectorAll('.el-table__body-wrapper > table > tbody')[0]// 获取 tbody 节点
  this.sortable = Sortable.create(el, {// 初始化顺便设置配置
    ghostClass: 'sortable-ghost', // 停靠位置样式(要拖动的元素的样式,给拖动的元素添加类名,自己再css中设置样式)
    setData: function(dataTransfer, dragEl) { // 避免 Firefox 的bug
      dataTransfer.setData('Text', dragEl.textContent)
    },
    // 拖动结束的回调
    onEnd: evt => {
      let oldList = this.listdata[evt.oldIndex];// oldIndex旧的排序
      let newList = this.listdata[evt.newIndex];// newIndex新的排序
      // 需要传递的参数
      this.sort = {  
        currId: oldList.id,
        newId: newList.id,
        currSort: oldList.sort,
        newSort: newList.sort
      }
      this.$emit('sortList', this.sort)// 触发父元素的发送请求,顺便把参数传过去
    }
  })
}

3.3、监听排序变化,重新渲染

watch: {
   listdata(){
     console.log('ok')
     this.oldList = this.listdata.map(v => v.id)
     this.newList = this.oldList.slice()
     this.$nextTick(() => {
       this.setSort()
     })
   }
 }

3.4、注册data

data(){
   return {
     sortable: null,
     oldList: [],
     newList: [],
     sort: {
       currId: 0,
       newId: 0,
       currSort: 0,
       newSort: 0
     }
   }
 },

注:拖拽排序的功能就完成了,但是需要注意:每个后端给的接口都不一样,你需要根据接口的返回参数以及需要的参数进行修改。

4、el-table后端排序实现

1、如果需要后端排序,需将sortable设置为custom,同时在 Table 上监听sort-change事件,在事件回调中可以获取当前排序的字段名和排序顺序,从而向接口请求排序后的表格数据。

<el-table @sort-change='tableSortChange'>
       <el-table-column sortable='custom' prop="createTime" label="创建时间">
       </el-table-column>
</el-table>

2、定义methods监听sort-change事件

tableSortChange(column) {
      this.listQuery.pageNo = 1
      if (column.order === 'descending') {
        this.listQuery.sortby = column.prop
        this.listQuery.order = 'desc'
      } else {
        this.listQuery.sortby = column.prop
        this.listQuery.order = 'asc'
      }
    this.getList()
 }

3、通过axios提交请求数据到后端

getList() {
      this.listLoading = true
      fetchList(this.listQuery).then(response => {
        this.list = response.data.items
        this.total = response.data.total
        this.listLoading = false
      })
    }
5、vue使用sortable实现拖拽排序完整版

vue项目中使用sortable实现对块元素拖拽进行排序

1、安装

npm install sortablejs --save

2、引入

import Sortable from 'sortablejs'

3、使用

<template>
  <div class="flex" id="items">
    <div class="item" v-for="(item,index) in value">
      <p>{{item.name}}</p>
    </div>
  </div>
</template>
<style scope>
  .item{
    width: 100px;
    height: 100px;
    border: solid 1px #ccc;
  }
  .flex{
    display: flex;
    justify-content: space-around;
  }
</style>

<script>
import Sortable from 'sortablejs'
export default {
  name: 'operationsAdd',
  data () {
    return {
      value: [
        { name: 11111 },
        { name: 22222 },
        { name: 33333 },
        { name: 44444 }
      ]
    }
  },
  methods: {
    test() {
      var that = this
      var el = document.getElementById('items')
      // 常用
      new Sortable(el, {
        onEnd: function (evt) {
         // 获取排序之后的data数据
          that.value.splice(evt.newIndex, 0, that.value.splice(evt.oldIndex, 1)[0])
          var newArray = that.value.slice(0)
          that.value = []
          that.$nextTick(function () {
            that.value = newArray
            console.log(that.value)
          })
        }
      })
    }
  },
  mounted () {
    this.test()
  }
}
</script>
Logo

前往低代码交流专区

更多推荐