使用sortableJs,实现嵌套拖拽排序,外层拖拽后后,内部再拖拽时,外层的索引还是之前的索引?

题目描述

在Vue项目中,实现嵌套拖拽排序功能,外层拖拽后,内部获取的索引值不是最新的。

题目来源及自己的思路

相关代码 粘贴代码文本(请勿用截图)

下方为外层的可拖拽结构

  <div class="table_box marTop"
          v-for="(item, index) in List"
          :key="item.id"
        >
          <div class="titname">
            <div class="leftname">
              <h3>{{ item.name }}</h3>
                <span style="color: red; font-size: 14px; margin-left: 20px"
                  >(下方表格支持拖动排序)</span
                >
              </div>
            </div>

          </div>

下方表格为内部可拖拽结构,使用element 表格布局

          <el-table :data="item.data" row-key="id" border stripe>
            <el-table-column
              type="index"
              label="前端排序"
              :width="80"
              align="center"
            >
            </el-table-column>
            <el-table-column label="内容标题" :width="500" align="center">
              <template slot-scope="scope">
                <span>{{ scope.row._targetInfo.title }}</span>
              </template>
            </el-table-column>
          </el-table>
        </div>

1、js部分

methods: {
    drag1() {
      // 内容的排序
      let el = document.querySelectorAll(
        ".el-table__body-wrapper > table > tbody"
      );

      console.log(el);
      for (let i = 0; i < el.length; i++) {
        Sortable.create(el[i], {
          fallbackOnBody: true,
          disabled: false, // 拖拽不可用? false 启用
          ghostClass: "sortable-ghost", //拖拽样式
          animation: 150, // 拖拽延时,效果更好看
          onEnd: (e) => {
            console.log(e, i);
            // 拖拽结束时的触发
            let item1 = this.List[i].data.splice(e.oldIndex, 1);
            this.List[i].data.splice(e.newIndex, 0, item1[0]); // 数据处理,获取最新的表格数据
}
    },
    drag2() {
      // 板块的排序
      let tabbox = document.querySelector(".bigBox");
      Sortable.create(tabbox, {
        disabled: false, // 拖拽不可用? false 启用
        ghostClass: "sortable-ghost", //拖拽样式
        animation: 150, // 拖拽延时,效果更好看
        onEnd: (e) => {
          console.log(e);
          // 拖拽结束时的触发
          let arr = this.List; // 获取表数据
          let item1 = arr.splice(e.oldIndex, 1);
          arr.splice(e.newIndex, 0, item1[0]); // 数据处理,获取最新的表格数据
        },
      });
    },

你期待的结果是什么?实际看到的错误信息又是什么?

当外层拖拽完成后,再去拖拽其内部的表格,打印结果不对。
比如,当前索引[1,2,3,4],拖拽完成后顺序为[2,1,3,4], drag1中打印i为[2,1,3,4],
正常拖拽完成后的索引应该还是[1,2,3,4],

尝试过在外层拖拽完成后Vue页面加载后,再次执行drag1,结果依旧。

阅读 4k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题