【问题标题】:vue.draggable dragging wrong elementvue.draggable 拖动错误的元素
【发布时间】:2020-04-03 06:22:32
【问题描述】:

我正在尝试使用 DnD 重新排序调色板中的颜色。 笔在这里: - https://codepen.io/neon22/project/editor/XbqvYe

<script type="text/x-template" id="cpalette">
  <div>
    <draggable v-model="colors" class="dragArea">
        <ul class="color-list" >
            <input type="hidden" :name="inputId" :id="inputId" v-model="colors">
            <li v-if="emptyOption">
                <a class="noColor" v-if="emptyOption !== 'true'" href="" @click.prevent="setColor();" :title="emptyOption === 'true' ? '' : emptyOption" :class="{selected: !selectedColor && !noSelection}"></a>
            </li>
          <!-- <draggable v-model="colors" tag='li' class="dragArea"> -->
            <li v-for="color in colors" :key="color.id" :data-id="color.id" >
                <a href="" :style="{background: color.hex}" :title="color.stash" @click.prevent="setColor(color.hex, color.id, color.stash)" :class="{selected: selectedColor === color.hex}"></a>
            </li>
          <!-- </draggable> -->
        </ul>
    </draggable>
  </div>
</script>

即我在同一个数组中重新排序。 (我还希望将其放入单独的区域以进​​行复制等)。 相反,我可以拖动整个 UL,但不能拖动单个 li 元素。我已经用它做了一段时间了,我自己也很困惑。我可以看到 chrome dev 中的类发生变化,所以我认为它几乎可以工作。 也许输入会妨碍您?

我试图得到这样的最终结果: - https://sortablejs.github.io/Vue.Draggable/#/transition-example-2 但我还没有添加过渡组。

我还希望能够将单个颜色拖放到第二个区域(@dropend 将复制它们等等......)事实上,如果我能更好地控制可拖动,那么也许我会做一个删除垃圾桶而不是一个按钮。

所以我想重新排序单个颜色并启用单独的放置目标。

任何帮助将不胜感激。我敢肯定它很简单:(

【问题讨论】:

    标签: vue.js color-palette vue.draggable


    【解决方案1】:

    您打算可拖动的元素应该是draggable 组件的直接子级或用transition-group 包裹。

    但在您的情况下,draggable 的唯一子级是无序列表,它是您打算可拖动的元素列表的父级。

    只需取消注释颜色列表周围的可拖动标签。

            <ul class="color-list" >
                <input type="hidden" :name="inputId" :id="inputId" v-model="colors">
                <li v-if="emptyOption">
                    <a class="noColor" v-if="emptyOption !== 'true'" href="" @click.prevent="setColor();" :title="emptyOption === 'true' ? '' : emptyOption" :class="{selected: !selectedColor && !noSelection}"></a>
                </li>
              <draggable v-model="colors" class="dragArea" group="color-stuff">
                <li v-for="color in colors" :key="color.id" :data-id="color.id" >
                    <a href="" :style="{background: color.hex}" :title="color.stash" @click.prevent="setColor(color.hex, color.id, color.stash)" :class="{selected: selectedColor === color.hex}"></a>
                </li>
              </draggable>
            </ul>
    

    现在,关于启用将颜色拖动到新区域以进行复制或删除:

    sortablevue draggable 是基于)是你可以拖动项目 列表中的可排序列表(重新排序)或 您可以将项目移动到另一个可排序的列表中 同一组。

    因此,您可以创建另一个 draggable 组件,并将 group 参数设置为与包含颜色的可拖动组件相同的值,然后覆盖 @end 或 @remove 方法,以便当您将颜色从颜色列表移动到 第二个可拖动区域,从第一个列表中删除的颜色被复制回它(这很hacky)

    或者你可以像这样简单地使用Html5 Drag and Drop

    <draggable v-model="colors" tag='li' class="dragArea">
        <li v-for="color in colors" 
            :key="color.id" 
            :data-id="color.id" 
            draggable='true'        
            @dragstart="functionToHandleDragStart" 
        >
              <a href="" 
            :style="{background: color.hex}" 
            :title="color.stash" 
            @click.prevent="setColor(color.hex, color.id, color.stash)" 
            :class="{selected: selectedColor === color.hex}"
              >
              </a>
        </li>
    </draggable>
    
    <div
        @drop="functionToHandleDrop"
        @dragover="(event)=>{event.preventDefault()}"
    >
            <p> drop target </p>
    
    </div>
    

    【讨论】:

    • 啊,我看到了直接孩子,但是当我这样做时,所有项目都消失了。我也必须进行 CSS 调整。而且我必须在 v-if 上方添加一个(相同的组)可拖动以捕获另一个展示柜。笔调整...
    • 是的,项目消失了,因为在 css 中,颜色的样式是为特定的祖先定义的,即 .color-item &gt; li &gt; a 。如果你添加另一个同组的可拖动对象并拖动到它,颜色将被转移到新的可拖动对象,你需要使用@end或@remove回调来反转它。我建议你使用html拖放来代替。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2018-09-19
    相关资源
    最近更新 更多