如何在 vue 可拖动列表旁边设置固定元素

Posted

技术标签:

【中文标题】如何在 vue 可拖动列表旁边设置固定元素【英文标题】:How can I set a fixed element alongside vue draggable list 【发布时间】:2019-04-16 11:19:53 【问题描述】:

我正在尝试使用vue-draggable 显示可拖动元素列表,这些元素有时在给定位置由固定元素分隔。

到目前为止,我尝试了以下方法:在 v-for 循环内需要时创建不同的元素。

<draggable :list="list" class="dragArea" :class="dragArea: true" 
           :options="group:'people', draggable: '.drag'" @change="handleChange">
    <template v-for="(element, index) in list">
      <div class="drag">
        element.name
      </div>
      <div class="nodrag" v-if="index === 2">Fixed element</div>
    </template>
</draggable>

但是,它破坏了我的应用程序的行为,因为 onChange 事件返回的索引不再是预期的。 (您可以在this jsfiddle 上查看复制品)

我做错了吗?我还考虑过使用move 道具来禁用拖动功能,如建议here 那样,但问题仍然存在,因为我相信我正在使用可拖动列表之外的元素。

在我们的生产用例中,固定元素的索引是可变的,如果这很重要的话。

【问题讨论】:

那么固定元素的位置不应该改变吗?还是它们只是不可拖动? 固定元素的位置不应该改变,它之前和之后应该有相同数量的可拖动项目。它实际上代表某种阈值 你为什么不列两个清单呢?否则,期望实际上是没有意义的。如果在固定之前有 2 个元素,在固定元素之后有 2 个元素 --> 那么你将 1 个元素从固定之前移动到之后,那么,固定之前的元素是什么?一个空字符串? 假设你有 A,B,Fixed,C,D 并且你将 B 移动到 C 和 D 之间,那么你应该得到 A,C,Fixed,B,D 理想情况下我希望 Fixed 只是可拖动组件逻辑完全忽略的视觉标志 我会听一些 onChange 事件,然后手动将元素移动到固定元素的上方/下方。当使用像 vue-draggable 这样的东西时,你必须记住,如果它不是根据你所想的功能开发的,你可能不得不自己创建它,即“手动”上下移动它们。您还可以 fork vue-draggable 或发出拉取请求以添加功能,这样您就可以保持代码更简洁。 【参考方案1】:

您可以在draggable 组件中使用move,然后指定哪些元素将是fixed。像这样的:

<draggable
  :list="list"
  :disabled="!enabled"
  class="your_class"
  :move="checkMove"
  @start="dragging = true"
  @end="dragging = false"
>
...
</draggable>

...........

data() 
  return
    list: [foo: "bar", ..., fixed: true, foo: "bar", ..., foo: "bar", ..., foo: "bar", ..., fixed: true]
  


...........

methods: 
  checkMove(e) 
    return !this.list[e.draggedContext.futureIndex].fixed
  

【讨论】:

【参考方案2】:

问题是你需要将你的“固定元素”作为数据包含在你传递给 Vue.Draggable 的数组中......你也不能拥有 v-if 因为 SortableJS 会将它们计为一个元素,即使它们不可见,因为 VueJS 将带有 v-if 的不可见元素作为 cmets... SortableJS 将索引这些 cmets。因此,在 John3 之后将一个项目添加到您的数组中,并去掉 v-if.. 而是在您的对象中包含一个 draggable 属性,并且仅在该元素将 draggable 属性设置为时才设置 'drag' 类真的。最后一个问题是 Sortable 不会索引不可拖动的元素,但这可能会在以后的更新中修复。我建议你现在使用filter 选项。

示例(不使用filter):https://jsfiddle.net/3wrj07et/5/

【讨论】:

以上是关于如何在 vue 可拖动列表旁边设置固定元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在jquery中使动态添加的列表元素可拖动?

在“停止”事件期间如何定位克隆的可拖动元素?

使用“克隆”助手执行可拖动事件后,如何删除原始元素?

jquery - 如何让列表元素可排序并且也可拖动到另一个列表

木头浏览器如何定位元素

如何克隆反应元素以进行拖动