# drag-and-drop
This consists of two directives, draggable and droppable, which automatically add and remove event listeners for drag and drop capability.
# Example
<div class="droppable" v-droppable="drop">
<img id="dragitem1" v-draggable="drag" :src="require('./assets/icons/guy.svg')">
<img id="dragitem2" v-draggable="drag" :src="require('./assets/icons/guy.svg')">
</div>
<div class="droppable" v-droppable="drop">
</div>
<script>
export default {
methods: {
drop: function(ev) {
const id = ev.dataTransfer.getData('text');
ev.target.appendChild(document.getElementById(id));
},
drag: function(ev) {
ev.dataTransfer.setData('text', ev.target.id);
}
}
}
</script>
Drag the images to the other box:
# Directives
draggable: Add this to elements that can be dragged
droppable: Add this to elements that items can be dropped onto.
# TODO
Add touch/mobile support.
# Source Code
# Draggable
<script>
export default {
bind: function(el, binding, vnode) {
el.setAttribute('draggable', true);
el.addEventListener('dragstart', binding.value);
},
unbind: function(el, binding, vnode) {
el.removeEventListener('dragstart', binding.value);
}
}
</script>
# Droppable
<script>
const preventDefault = (ev) => ev.preventDefault();
export default {
bind: function(el, binding, vnode) {
el.addEventListener('dragover', preventDefault);
el.addEventListener('drop', binding.value);
},
unbind: function(el, binding, vnode) {
el.removeEventListener('dragover', preventDefault);
el.removeEventListener('drop', binding.value);
}
}
</script>