Alfred-Skyblue / vue-draggable-plus

Universal Drag-and-Drop Component Supporting both Vue 3 and Vue 2
https://vue-draggable-plus.pages.dev/en/
MIT License
2.72k stars 106 forks source link

当使用ul、li作为拖拽元素,进行多列表拖拽时元素顺序异常 #98

Closed Aaron-zon closed 4 months ago

Aaron-zon commented 4 months ago

例子:https://stackblitz.com/edit/vitejs-vite-epfmzq?file=src%2FApp.vue 以上用一个简单的双列表的组件模式写了个例子,只要使用ul、li、ol在其他模式也会有相同的效果。

流程:

将第一个容器中的元素拖拽到第二个容器的最后,鼠标抬起后该元素移动到了第二个容器的首位。

预期:

鼠标抬起后该元素停留在第二个容器最后的位置 msedge_cwY1znxRIP

Alfred-Skyblue commented 4 months ago

这是 Sortablejs 的问题,请规范使用嵌套元素,如果目标元素为ul,请确保子元素为li,如果目标元素为div,请确保子元素为div。

Aaron-zon commented 4 months ago

这是 Sortablejs 的问题,请规范使用舞蹈元素,如果目标元素为ul,请确保子元素为li,如果目标元素为div,请确保子元素为div。

chrome_dmDBy95QGr

谢谢,我也觉得这种嵌套关系应该规范一些,不过Sortablejs看起来已经解决这个问题了,对ul、li这种结构应该有特殊的处理

image image

在使用ul、li时如果insertElement使用evt.newIndex则可以让元素显示在正常的位置上。

image

不过我还没太搞清楚newIndex和newDraggableIndex代表什么,这样写可能会有其他问题,请问您知道这两个分别代表什么吗?

Alfred-Skyblue commented 4 months ago

image

实际上问题并没有被解决,newIndex为最新的index,newDraggableIndex为当前列表中排除不可拖拽项意外的index,在上述的案例中,我猜测您直接使用了 sortablejs,但是它与数据没有绑定关系,实际上获取到的 newDraggableIndex 依然为0,当我们在vue中使用时,需要对数据进行绑定,此时如果 newDraggableIndex 为0,将会把数据移动到数组的第一项。

Aaron-zon commented 4 months ago

图像

其实问题并没有被解决,newIndex为最新的索引,newDraggableIndex为当前列表中排除不可拖拽关系意外的索引,在上述的案例中,我猜测你直接使用了sortablejs,但是它与数据没有绑定,实际上获取到的newDraggableIndex仍然为0,当我们在vue中使用时,需要对数据进行绑定,此时如果newDraggableIndex为0,就会把数据移动到备份的第一个。

谢谢,那这样的话我使用evt.newIndex的修改方式,在当前列表有不可拖拽元素时可能会出问题是吗

Alfred-Skyblue commented 4 months ago

谢谢,那这样的话我使用evt.newIndex的修改方式,在当前列表有不可拖拽元素时可能会出问题是吗

是的,参考 https://github.com/Alfred-Skyblue/vue-draggable-plus/pull/44