vue 中使用 sortable 库拖拽列表

sortable.js 可以实现对 dom 的拖放排序,在 vue 中,往往更新的 dom 后,数据也要排序。同步更新。这时,由于 vnode diff 算法的作用,数据变化又会更新 dom,使 sortable 拖动『失效』。解决办法是,拖放后,还原 dom 的变化,使用 vue 更新 dom 的机制。

  <ul class="ul">
       <li v-for="(item, index) in testArr" :key="item.id" class="li">
           <div>
              <span>{{index + 1}}</span>
               <span>{{item.title}}</span>
           </div>
      </li>
  </ul>
    mounted() {
        const $ul = document.querySelector('.ul');
        Sortable.create($ul, {
            onEnd: evt => {
                const {oldIndex, newIndex} = evt;
                const arr = this.testArr,
                    oldItem =arr[oldIndex],
                    newItem = arr[newIndex];

                const $lis = $ul.children,
                    $li = $lis[newIndex],
                    $oldLi = $lis[oldIndex];

                // 先删除移动的节点
                $ul.removeChild($li);
                // 再插入移动的节点到原有节点,还原了移动的操作
                if (newIndex > oldIndex) {
                    $ul.insertBefore($li, $oldLi);
                } else {
                    $ul.insertBefore($li, $oldLi.nextSibling);
                }

                this.$set(arr, oldIndex, newItem);
                this.$set(arr, newIndex, oldItem);
            }
        });
    },
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 之前开发一个后台管理系统,里面用到了Vue和Element-UI这个组件库,遇到一个挺有意思的问题,和大家分享一下...
    文兴阅读 30,477评论 10 28
  • 我们都知道html5的拖放特性,利用它可以很方便的实现拖拽和放置功能,比如一些选择类操作的使用场景,让用户去拖拽比...
    _乾_阅读 5,313评论 2 13
  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 12,007评论 0 25
  • 转载 :OpenDiggawesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库...
    果汁密码阅读 23,300评论 8 124
  • https://cn.vuejs.org 转载 :OpenDigg awesome-github-vue 是由Op...
    文朝明阅读 11,651评论 0 38