使用sortablejs拖拽列表排序

sortablejs版本 ^1.14.0,框架:vue,UI:element
import Sortable from "sortablejs" // 引入

开始使用:

// 我的接口,请求表格数据
fetchData(){
	getUser().then(res => {
		this.list = res.data.data;
        this.total = res.data.count;
		this.$nextTick(() => {
			// 表格渲染完成,调用拖拽排序方法
        	this.setSort();
    	});
	})
}
setSort() {
	  // 取到表格的表体tbody(这里是elementUI,listData是我el-table的ref)
      const el = this.$refs.listData.$el.querySelectorAll(
        '.el-table__body-wrapper > table > tbody'
      )[0];
      this.sortable = Sortable.create(el, {
        ghostClass: 'sortable-ghost', // Class name for the drop placeholder,
        setData: function (dataTransfer) {
          // to avoid Firefox bug
          // Detail see : https://github.com/RubaXa/Sortable/issues/1012
          dataTransfer.setData('Text', '');
        },
        onEnd: async evt => {
          const targetRow = this.list.splice(evt.oldIndex, 1)[0];
          this.list.splice(evt.newIndex, 0, targetRow);
		  // 如果没有可供用户自定义的排序字段(使用list的index排序),无需进行下面这一步,直接更新list就行
		  // 我这里用户使用orderNum存贮自己的排序,所以相邻行要进行orderNum交换
          if (evt.oldIndex === evt.newIndex) { // 没有交换过,什么也不做
            return false;
          }
          let start, end;
          // 从上往下拖拽
          if (evt.oldIndex < evt.newIndex) {
            start = evt.oldIndex;
            end = evt.newIndex;
            // 先存最后一个
            const endOrderNum = this.list[end].orderNum;
            for (let i = end; i > start; i--) {
              const item = this.list[i];
              const FItem = this.list[i - 1];
              item.orderNum = FItem.orderNum;
            }
            // 把最后一个赋值给第一个
            this.list[start].orderNum = endOrderNum;

            // 更新表格,这里暂时没有批量修改接口所以这样写,换成批量修改接口后直接传list全部修改就好
            for (let i = end; i >= start; i--) {
              await updatesysCustomFormDet(this.list[i]);
            }
          } else {
            // 从下往上拖拽
            start = evt.newIndex;
            end = evt.oldIndex;
            // 先存第一个
            const startOrderNum = this.list[start].orderNum;
            for (let i = start; i < end; i++) {
              const item = this.list[i];
              const LItem = this.list[i + 1];
              item.orderNum = LItem.orderNum;
            }
            // 把第一个赋值给最后一个
            this.list[end].orderNum = startOrderNum;

            // 更新表格,这里暂时没有批量修改接口所以这样写,换成批量修改接口后直接传list全部修改就好
            for (let i = start; i <= end; i++) {
              await updatesysCustomFormDet(this.list[i]);
            }
          }
		  // 更新完成,刷新一下表格
          this.fetchData();
        },
      });
    },
 
<style>
/* 拖拽时,当前行落点的样式 */
.sortable-ghost {
  opacity: 0.8;
  color: #fff !important;
  background: #42b983 !important;
}
</style>

更多用法和配置请查阅https://www.npmjs.com/package/sortablejs

Vue.js 2 中,你可以使用 SortableJS 这个强大的 JavaScript 插件来实现在两个列表之间进行拖拽交互。以下是简单的步骤: 1. 首先,你需要安装 SortableJS 和它的依赖库,比如 VueSortable 或者直接在项目中通过 npm 安装: ``` npm install sortablejs vue-sortable vuedraggable ``` 2. 引入所需的模块到你的 Vue 组件中: ```javascript import Sortable from 'vue-sortable'; import draggable from 'vuedraggable'; ``` 3. 创建两个数据数组,假设分别为 `listA` 和 `listB`,并将它们绑定给 Sortable 或 draggable 的元素: ```html <ul id="listA" v-model="listA" :sortable="optionsA"> <!-- ...每个项的 HTML模板... --> </ul> <ul id="listB" v-model="listB" :draggable="true"> <!-- ...每个项的 HTML模板... --> </ul> ``` 4. 初始化 Sortable 或 draggable 的配置,包括排序选项: ```javascript data() { return { listA: [...], // 初始化的数据 listB: [...], optionsA: { /* SortableJS 的配置 */ }, }; }, methods: { handleDrop(event) { /* 接收拖放事件并更新数据 */ const draggedItem = event.dragged; const droppedIndex = event.newIndex; this.$set(this.listB, droppedIndex, draggedItem); // 将item移动到新位置 } } ``` 5. 对于 SortableJS,你需要提供类似这样的配置: ```javascript methods: { optionsA: { group: '__group__', // 指定哪些元素可以互相拖动 animation: 150, onEnd: (event) => { this.handleDrop(event); }, }, } ``` 6. 当一个元素从 `listA` 被拖放到 `listB`,在 `handleDrop` 方法中处理数据的变化,确保同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值