sortablejs中文文档,vue项目中拖拽排序,element-ui中table拖拽排序

本文介绍了如何通过npm安装SortableJS库,并在项目中导入和使用它来实现列表元素的拖拽排序功能。详细讲解了SortableJS的配置选项,包括事件回调、动画效果等,并展示了在element-ui的表格中实现拖拽排序的示例代码。同时提供了SortableJS的源码链接供进一步参考。
摘要由CSDN通过智能技术生成

 一使用npm装包

npm install sortablejs --save

二再项目中使用

import Sortable from 'sortablejs';
<ul id="items">
	<li>item 1</li>
	<li>item 2</li>
	<li>item 3</li>
</ul>
var el = document.getElementById('items');
var sortable = Sortable.create(el,{options});

 三 完整配置

var sortable = new Sortable(el, {
	group: "name",  // or { name: "...", pull: [true, false, 'clone', array], put: [true, false, array] }
	sort: true,  // 列表内部排序
	delay: 0, // 定义排序开始时间的时间(毫秒)
	delayOnTouchOnly: false, // 仅当用户使用触摸时延迟
	touchStartThreshold: 0, // px,在取消延迟拖动事件之前,该点应移动多少像素
	disabled: false, // 如果设置为true,则禁用可排序
	store: null,  // @see Store
	animation: 150,  // ms,动画速度排序时移动项目,`0`-无动画
	easing: "cubic-bezier(1, 0, 0, 1)", // 动画的缓和。默认为null。看见https://easings.net/例如。
	handle: ".my-handle",  // 在列表项中拖动句柄选择器
	filter: ".ignore-elements",  // 不会导致拖动的选择器(字符串或函数)
	preventOnFilter: true, // Call `event.preventDefault()` when triggered `filter`
	draggable: ".item",  // 指定元素中应可拖动的项目

	dataIdAttr: 'data-id', //toArray()`方法使用的HTML属性

	ghostClass: "sortable-ghost",  // 放置占位符的类名
	chosenClass: "sortable-chosen",  // 所选项目的类名
	dragClass: "sortable-drag",  // 拖动项的类名

	swapThreshold: 1, // 交换区阈值
	invertSwap: false, // 如果设置为true,将始终使用反向交换区域
	invertedSwapThreshold: 1, // 反向交换区的阈值(默认情况下将设置为swapThreshold值)
	direction: 'horizontal', // 可排序方向(如果未给出,将自动检测)

	forceFallback: false,  // ignore the HTML5 DnD behaviour and force the fallback to kick in

	fallbackClass: "sortable-fallback",  // 使用forceFallback时克隆的DOM元素的类名
	fallbackOnBody: false,  // 将克隆的DOM元素附加到文档的正文中
	fallbackTolerance: 0, // 以像素为单位指定鼠标在被视为拖动之前应移动的距离。

	dragoverBubble: false,
	removeCloneOnHide: true, //在克隆元素未显示时将其删除,而不是将其隐藏
	emptyInsertThreshold: 5, // px,距离鼠标必须从空可排序位置开始,才能将拖动元素插入其中


	setData: function (/** DataTransfer */dataTransfer, /** HTMLElement*/dragEl) {
		dataTransfer.setData('Text', dragEl.textContent); // `dataTransfer` object of HTML5 DragEvent
	},

	// 已选择元素
	onChoose: function (/**Event*/evt) {
		evt.oldIndex;  // element index within parent
	},

	// 元素未关闭
	onUnchoose: function(/**Event*/evt) {
		// same properties as onEnd
	},

	// 元素拖动已开始
	onStart: function (/**Event*/evt) {
		evt.oldIndex;  // element index within parent
	},

	// 元素拖动结束
	onEnd: function (/**Event*/evt) {
		var itemEl = evt.item;  // dragged HTMLElement
		evt.to;    // target list
		evt.from;  // previous list
		evt.oldIndex;  // element's old index within old parent
		evt.newIndex;  // element's new index within new parent
		evt.oldDraggableIndex; // element's old index within old parent, only counting draggable elements
		evt.newDraggableIndex; // element's new index within new parent, only counting draggable elements
		evt.clone // the clone element
		evt.pullMode;  // when item is in another sortable: `"clone"` if cloning, `true` if moving
	},

	// 元素从另一个列表中拖放到列表中
	onAdd: function (/**Event*/evt) {
		// 与onEnd相同的属性
	},

	// 更改了列表内的排序
	onUpdate: function (/**Event*/evt) {
		//与onEnd相同的属性
	},

	// 由列表的任何更改调用(添加/更新/删除)
	onSort: function (/**Event*/evt) {
		// 与onEnd相同的属性
	},

	// 元素从列表中删除到另一个列表中
	onRemove: function (/**Event*/evt) {
		// 与onEnd相同的属性
	},

	// 尝试拖动筛选的元素
	onFilter: function (/**Event*/evt) {
		var itemEl = evt.item;  //HTMLElement接收“mousedown”、“tapstart”事件。
	},

	// 在列表中或列表之间移动项目时发生的事件
	onMove: function (/**Event*/evt, /**Event*/originalEvent) {
		// Example: https://jsbin.com/nawahef/edit?js,output
		evt.dragged; // dragged HTMLElement
		evt.draggedRect; // DOMRect {left, top, right, bottom}
		evt.related; // HTMLElement on which have guided
		evt.relatedRect; // DOMRect
		evt.willInsertAfter; // Boolean that is true if Sortable will insert drag element after target by default
		originalEvent.clientY; // mouse position
		// return false; — for cancel
		// return -1; — insert before target
		// return 1; — insert after target
		// return true; — keep default insertion point based on the direction
		// return void; — keep default insertion point based on the direction
	},

	// 创建元素克隆时调用
	onClone: function (/**Event*/evt) {
		var origEl = evt.item;
		var cloneEl = evt.clone;
	},

	// 拖动元素更改位置时调用
	onChange: function(/**Event*/evt) {
		evt.newIndex //使用此事件的最可能原因是获取拖动元素的当前索引
		//  与onEnd相同的属性
	}
});

四 element-ui中的table拖拽

注意 row-key的值是tableDate中必须是唯一的,一般用id

<template>
  <div>

    <el-table
      ref="table"
      :data="tableData"
      style="width: 100%"
      row-key="fileId"
    >
      >
      <el-table-column type="selection" width="55" />
    </el-table>
  </div>
</template>
<script>
export default {
  props: {
    tableData: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      multipleSelection: [],
      testModeCode: null
    }
  },
  mounted() {

    this.setSort()//注意要再这里触发一下
  },
  methods: {
    setSort() {
//获取table中的所有row
      const el = this.$refs.table.$el.querySelectorAll(
        '.el-table__body-wrapper > table > tbody'
      )[0]
      this.sortable = Sortable.create(el, {
        ghostClass: 'sortable-ghost',
        draggable: '.Nofolder',
        setData: function(dataTransfer) {
          console.log(dataTransfer, 'dataTransfer')
          dataTransfer.setData('Text', '')
        },
        onUnchoose: function(/** Event*/evt) {
        // same properties as onEnd
          return false
        },
        onChoose: function(evt) {
          console.log('0909', evt)
          // this_.$emit('handleIfSwipeabl', false)
          return false
        },
        // 监听拖拽事件结束时触发
        onEnd: evt => {
          // return false
          console.log(evt)
          // 拖动行的前一行
          const targetRow = this.tableData.splice(evt.oldIndex, 1)[0]
          // 拖动行的后一行
          this.tableData.splice(evt.newIndex, 0, targetRow)
          // 这里的tableData是你table上面绑定的list
        }
      })
    },
  }
}
</script>

可以参考源码https://github.com/SortableJS/Sortable

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值