【问题标题】:VueJs draggable sortable cancel adding element without cancel the drag previewVueJs可拖动可排序取消添加元素而不取消拖动预览
【发布时间】:2017-08-18 11:49:15
【问题描述】:

我正在与draggable and sortable with vueJS 合作,我正在努力完成一件事,基本上我有 2 个列表,第一个是包含一些部分的列表,例如(表格、段落 ...)第二个是构建块有了这个部分,但基本上我需要的流程是,将一个元素从 list1 拖到 list2,但不要添加元素这很重要,因为我需要先打开一个模式来设置将要添加的元素,然后将其添加到 futureIndex 中。

目前我有一个解决方案,我几乎可以做我需要的事情,我只需要了解如何取消添加元素而无需为拖动的预览而苦恼,我的意思是预览:

我想看看中间那个元素的加法。

所以我的第一个列表是这样做的:

<draggable v-model="sectionList" class="dragArea" @end="changeView()" :move="moveItem" :options="{group:{ name:'sections',pull:'clone',put:false }}">
    <div v-for="(section, index) in sectionList"  class="card card-color list-complete-item">
        <div class="card-block">
            <h4 class="card-title text-center">{{section.text}}</h4>
        </div>
    </div>
</draggable>

methods: {
    addParagraph() {
        this.$set(this.paragraph, 'key', this.key);
        this.$set(this.paragraph, 'text', this.text);
        this.$set(this.paragraph, 'fontSize', this.fontSize);
        this.$store.commit("appendToDocument", this.paragraph)
    },
    changeView: function () {
        this.$store.commit("changeCurrentView", this.sectionList[this.dragedIndex].component);
        this.show();
    },
    show() {
        this.$modal.show('modalSection');
    },
    hide() {
        this.$modal.hide('modalSection');
    },
    currentIndex(evt) {
        console.log(evt.draggedContext.index);
    },
    moveItem(evt) { // future index of the modal that will be draged
        console.log(evt.draggedContext.futureIndex);
        this.dragedIndex = evt.draggedContext.index;
    }
},

第二个列表并不重要,只要我能理解这篇文章,如何在不添加的情况下移动项目并查看预览。我在最后添加了 return false,但是我看不到预览,也无法在同一个列表之间拖动元素。

有什么帮助吗?

【问题讨论】:

  • 为什么不在放置时插入元素?您可以使用克隆道具用占位符值填充克隆的元素并在结束事件时打开模型?我想它会完成这项工作,使用 move 道具和 futureindex 可能会出现问题,因为 futureindex 值存在一些已知问题
  • 我想要这个解决方案的朋友,如果你能用一个例子来详细说明一下:)

标签: javascript vue.js vuejs2 draggable jquery-ui-sortable


【解决方案1】:

sortable 本身,Vue.draggable 所基于的库,没有 drop 事件处理程序 (link),但这可以帮助您入门:https://jsfiddle.net/94z81596/10/。关键思想是利用change 处理程序:

<draggable 
  id="list2" 
  class="dragArea" 
  :options="{group:'people'}" 
  @change="afterAdd"
  :list="gDocument">
...
</draggable>

解决方案可以更简单,您只需在checkMove 中跟踪futureIndex(并将其保存到placeholder)和return false,然后通过Vuex 手动插入项目。我目前的解决方案已经在做几乎相同的事情了。

但我打算保留预览,以便用户知道他们在哪里插入元素。所以我做了一些工作来清理列表:

state.document = state.document.filter((item) => item.value);

【讨论】:

  • 所以基本上我应该让插入第一个元素以保持预览,删除他显示模态,然后插入元素?我明天会尝试我的解决方案,我记得当我使用 :move 返回 false 时,futureIndex 有问题,futureIndex 总是错误的,但如果我更改返回它是正确的
  • 如果你想保留预览,这种方式比较简单,而且可以纠正drop后sortable所做的事情,我们无法处理。
  • 工作了,我改变了一点你的实现,但是onchange方法很适合这个,谢谢,我会接受的,只是一件事,有时futureIndex有点错误是正常的吗?
  • 通常我使用它的时候并没有发现任何问题,但是我将不得不更深入地查看sortable 的源代码中发生的事情futureIndex 来回答你的问题问题。
  • 我注意到一些事情,例如我只有 1 个元素并尝试在它下面添加,futureIndex 是 0 而不是 1,当我拖动顶部并再次 bot 看起来很好
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 2012-05-14
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-23
相关资源
最近更新 更多