Vue.Draggable 通过拖拽到指定区域来删除项目

slo*_*ent 4 javascript draggable vue.js rubaxa-sortable vue.draggable

我一直在用头撞墙试图弄清楚这一点。我在这里通过 Sortable.js 库 repo 找到了一个几乎完全符合我想要做的示例,但我无法使用Vue.Draggable实现它。

我的理论是添加一个与其余元素<draggable/>相同group的元素并侦听其@add上的事件,然后从其列表中删除该拖动的元素。

一个问题(可能)是我试图将“垃圾箱”按钮指定为删除区域,如果它引用相同的 draggable group,则该拖动的元素将附加到按钮组并抛出整个 UI。所以,一件非常重要的事情是有某种用户反馈(例如,当拖动元素悬停时垃圾桶图标变成红色),但被拖动的元素不应该被插入到按钮组中。

初始拖动状态

将鼠标光标悬停在要删除的项目上

预期的删除操作

在此处输入图片说明

提前致谢!

Sum*_*ai8 7

让我们依次解决一些问题:

如何让垃圾可拖动接受任何组

答案是设置组属性的pullpush

  trashOptions: {
    group: {
      name: 'trash',
      draggable: '.dropitem',
      put: () => true,
      pull: false
    }
  }
Run Code Online (Sandbox Code Playgroud)

通过设置put为始终返回 true 的函数,它将接受任何组。或者,您可以将其设置为包含您接受的组的数组。

将按钮设置为可拖动区域时,如何防止按钮被弄乱

最简单的方法是将插入的项目设置为display: none。您可以简单地隐藏您设置为draggable属性的任何内容,或使用该ghostClass设置(根据文档)。

我如何给用户反馈?

这个很棘手。Draggable 不会在您使用的可拖动区域上设置类。但是,您可以使用智能 css 选择器来实现您想要的。首先我们定义一个页脚。

<draggable v-model="trashZone" class="dropzone trashzone" :options="trashOptions">
  <div slot="footer" class="footer">Trash</div>
</draggable>
Run Code Online (Sandbox Code Playgroud)

我们将这个绝对定位到 dropzone 并确保它覆盖整个事物。删除的元素现在将始终出现在页脚之前。这很棒,因为我们可以使用 next-selector ( +) 选择插入 dropitem 之后的页脚,并应用不同的样式。在这种情况下,我们应用红色背景并将文本设为白色。

.trashzone .footer {
  display: block;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}

.trashzone .dropitem + .footer {
  background: red;
  color: white;
}
Run Code Online (Sandbox Code Playgroud)

代码沙盒上提供了一个完整的工作示例。

编辑 Vue 模板