React如何使用sortablejs实现拖拽排序

lxf2023-05-05 06:18:02
摘要

这篇文章主要介绍了React如何使用sortablejs实现拖拽排序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

目录
  • React使用sortablejs实现拖拽排序
  • sortablejs之强大的拖拽库
    • 安装
    • 基本示例
    • 常用配置
  • 总结

    React使用sortablejs实现拖拽排序

    1、使用npm装包

    $ npm install sortablejs --save
    

    2、引入Sortable

    import Sortable from "sortablejs";

    3、使用方法

    <div className="grid-box" ref={this.sortableGroupDecorator}>
        {menus &&
            menus.map((item, i) => {
                return this.renderSelectedItemView(item, i);
            })}
    </div>
    
    sortableGroupDecorator = componentBackingInstance => {
        if (componentBackingInstance) {
            let options = {
                draggable: ".rows",
                // animation: "150",
                onEnd: evt => {
                    let children = evt.to.children;
                }
            };
            Sortable.create(componentBackingInstance, options);
        }
    };
    

    sortablejs之强大的拖拽库

    Sortable.js是一款优秀的js拖拽库,支持ie9及以上版本ie浏览器和现代浏览器,也可以运行在移动触摸设备中。

    不依赖Jquery,支持 Meteor、angularJS、React、Vue、Knockout框架和任何CSS库,如Bootstrap、Element UI。你可以用来拖拽div、table等元素。

    Sortable.js可以实现同组内上下拖动元素,也可以实现不同组内互相拖动元素。

    安装

    npm i sortablejs -S

    基本示例

    以下示例基于 Vue2:

    <template>
      <div ref="box">
        <div data->a</div>
        <div data->b</div>
        <div data->c</div>
      </div>
    </template>
     
    <script>
    import Sortable from 'sortablejs';
     
    export default {
        mounted() {
          this.$nextTick(function() {
            this.initSortable();
          });
        },
        methods: {
          initSortable() {
            let sortable;
            // 拖动配置
            const ops = {
                animation: 200,
                group: "name",
                // 拖动结束
                onEnd: function (evt) {
                    // 获取拖动后的排序,arr数组里的值是 data-id 的顺序
                    let arr = sortable.toArray();
                    console.log({evt, arr})
                },
            };
            //初始化
            sortable = Sortable.create(this.$refs.box, ops);
          }
        },
    };
    </script>

    常用配置

    const config = {
      //一个网页存在多个分组时设置,组名相同的组之间元素可以相互拖拽
      group: "name",
      //2种group写法选一种就可以了
      group: { 
        name: 'name',
        pull: 'clone', //克隆元素
      },
      //是否允许元素内部排序,如果为false当有多个排序组时,多个组之间可以拖拽,本身不能拖拽(默认true)
      sort: true,
      //是否禁用拖拽和排序
      disabled: false,
      //动画效果持续时间(不设置或0都没有过渡效果)
      animation: 150,
      //点击指定class类的元素才能拖拽(比如点击元素内的图标才能拖拽元素,可以给图标设置my-handle class)
      //class可以定义在元素本身上,也可以定义在子元素上
      handle: ".my-handle",
      // class为ignore的元素不能拖动
      filter: ".ignore",
      //含有item 类的元素可以被拖拽(class只能定义在元素本身上)
      draggable: ".item",
      //指定获取拖动后排序的属性
      dataidAttr: 'data-id',
      //给停靠位置添加的class(可以给这个class定义样式)
      ghostClass: "ghost",
      //选中元素添加的类(包括悬浮的元素和停靠位置的元素)
      chosenClass: "chosen",
      //拖拽对象移动时添加的类
      draGClass: "drag",
      //禁用HTML5原生拖拽
      forceFallback: false,
      ...
     
      //克隆事件
      onClone: function (evt) {
          //被克隆的对象(被移到另外地方的那个元素)
          var origEl = evt.item;
          //克隆后的对象(还是在原来位置的元素)
          var cloneEl = evt.clone;
          cloneEl.innerhtml = "clone出的元素";
      },
      ...
    }

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。