Vue.jsでドラッグ&ドロップで要素を動かしたいなと思い、HTML5のDrag and Drop APIの利用を考えましたが、移動元の要素の場所をドラッグ開始時(dragstart イベント)に保持して、ドロップ時(drop イベント)に要素を並び替える必要があり、少々実装が複雑です。もっと手軽な方法はないかと探してみると、 Vue.Draggable が見つかりました。
Vue.Draggableを利用すれば、Vue.jsで簡単に要素をドラッグ&ドロップで並び替えることができます。今回は、Vue.Draggableの手軽な使い方について書いていこうと思います。この記事では、Vue.jsのプロジェクトがvue-cliで作成済みであること、Single File Componentで利用することを前提とします。
Vue.Draggableのインストール
手順はVue.jsのプロジェクトに npm や yarn 経由で vuedraggable をインストールするだけです。実行コマンドは次のようになります。
npm install vuedraggable -D
要素をドラッグ&ドロップで移動
ドラッグ&ドロップで並び替えたい要素のリストをVue.Draggableのコンポーネントのスロットに入れることで、簡単に要素を動かせるようになります。以降では、Vue.Draggableのコンポーネントを draggable として import します。
リスト内での移動
単一のリスト内で要素を並び替える際には、要素群を draggable のスロットに格納します。リストのデータを保持する配列を並び替え操作に反映させるためには、 draggable の v-model ディレクティブに配列を与えます。

配列 flowers からなるリストについて、ドラッグ&ドロップで要素を動かすための実装例を示します。Vue.Draggableを使ってリストの要素を並び替えるコード例は以下の通りです。
<template> <ul> <draggable v-model="array"> <li v-for="flower in flowers" :key="flower.id">{{ flower.name }}</li> </draggable> </ul> </template> <script> import draggable from 'vuedraggable'; export default { components: { draggable }, data() { return { flowers: [ { id: 1, name: 'Wisteria' }, { id: 2, name: 'Dandelion' }, { id: 3, name: 'Pansy' }, ], }; }, }; </script>
上記のコードは、 li 要素がドラッグ&ドロップで並び替えられます。また、 li のデータを格納する配列 flowers が draggable コンポーネントの v-model ディレクティブに紐づけられているので、ドラッグ&ドロップで要素の場所が変わった際に、 flowers も自動的に要素が並び替えられます。
別のリストへの移動
Vue.Draggableを使えば、同一のリスト内で要素を動かすだけでなく、別のリストに要素を移動することも可能です。例えば、プロジェクト管理システムでタスクをTo DoのリストからDoingのリストに移すようなことが簡単に実装できます。

移動する要素を別のリストに移すためには、 group プロパティを利用します。同じ group として指定されていれば、別のリストにも要素をドラッグ&ドロップで移動できます。
ソースコード例は以下の通りです。
<template> <ul> <draggable v-model="todos" group="tasks"> <li v-for="task in todos" :key="task.id">{{ task.title }}</li> </draggable> </ul> <ul> <draggable v-model="dones" group="tasks"> <li v-for="task in dones" :key="task.id">{{ task.title }}</li> </draggable> </ul> </template> <script> import draggable from 'vuedraggable'; export default { components: { draggable }, data() { return { todos: [ { id: 1, title: 'Bake cake.' }, { id: 2, title: 'Harvest raspberry' }, ], dones: [ { id: 3, title: 'Pour coffee' }, ], }; }, }; </script>
上記のプログラム例では、配列 todos と dones の要素がそれぞれ同じ group に指定されています。同じ group として指定することで、 todos の要素を dones に、 dones の要素を todos に移動できます。
まとめ
Vue.Draggableを利用すれば、簡単に要素をドラッグ&ドロップで移動させることができます。1つのリスト内での移動だけでなく、別のリストに要素を移動させる処理も手軽に書くことができます。
Vue.Draggableは Sortable.js をベースに作られており、要素の移動時のイベント処理を記述することもできます。詳細は Vue.DraggableのGitHubリポジトリを参照してください。