CULTURE
Drag & Dropによるカンバンボードの実装について
- プロダクト
初めに
こんにちは。 Uniforce株式会社でフロントエンドを担当している、浅川です。
今回は、ドラッグ&ドロップ機能のあるカンバンボードを実装した際に、vue.draggable.nextを利用して実装したことについて書きたいと思います。
機能実装時はVue2系で実装していたのですが、Vue3に移行したため、Vue3での実装の仕方を紹介します。
開発環境
Nuxt3 + Vue(v3.4.15) + vue.draggable.next(v4.0.1)
インストール
弊社ではnpmを利用しているため、下記コマンドでインストールします。
npm i -S vuedraggable@next
そのほかについては、githubのinstallationから確認してみてください。
コンポーネント読み込み
draggableをコンポーネントとして、利用するためにdefineNuxtPlugin
で読み込んでおきます。
import Draggable from 'vuedraggable'
export default defineNuxtPlugin((nuxtApp) => {
nuxtApp.vueApp.component('Draggable', Draggable)
})
使い方
使い方は簡単で、ドラッグさせたいコンポーネントを<draggable>
で挟むことで簡単にドラッグ&ドロップが実装できます。
Vue3からは、draggableタグ以下にtemplateでドラッグさせたいコンポーネントを囲む必要があります。
templateのelementはv-modelに設定した配列のアイテムが入ってきます。
item-keyはループ要素のkey値になります。
Vue2
<draggable v-model="myArray">
<div v-for="element in myArray" :key="element.id">{{element.name}}</div>
</draggable>
Vue3
<draggable v-model="myArray" item-key="id">
<template #item="{element}">
<div>{{element.name}}</div> // ドラッグさせたいアイテム
</template>
</draggable>
Event
draggableにはイベントが複数あります。
ドラッグ完了後など、タイミングによって発火したいイベントが違うときに下記から選択する必要があります。
start | ドラッグ開始 |
---|---|
add | 要素追加時 |
remove | 要素削除時 |
update | ドラッグでの要素の移動完了時 |
end | ドラッグでの要素の移動が完了した際の最後に発火される |
choose | ドラッグ要素を選択したとき |
unchoose | ドラッグ要素を選択から外したとき |
sort | 並び順を変更した際updateとendの間で発火 |
filter | フィルターされた際 |
clone | ドラック時に生成されるシャドークローン生成時 |
実装
実際の実装では下記のような感じにしています。
<draggable
:list="myArray"
:group="groupTag"
:animation="300"
:sort="false"
item-key="id"
handle=".item_class"
>
<template #item="{ element }">
<div class="item_class">
// ドラッグしたい内容
</div>
</template>
</draggable>
group: 複数のボードがある場合、同じgroupタグを持っているボード内だけでドラッグ&ドロップができるように制御します。
animation: ドラッグ&ドロップ時のソートアニメーションの速度をミリ秒で指定できます。
sort: 自動のソーティングを無効にしています。日時やIDによるソートをしたい場合などにfalseを指定しておくといいと思います。
handle: 指定しているクラスの範囲をドラッグ領域にすることができます。
最後に
ここまで読んでいただきありがとうございます。
vue.draggableを利用することで、簡単にドラッグ&ドロップの機能を実装することができました。
イベントも充実しているので、細かい調整をすればある程度のやりたいことができそうです。
- Writer
Uniforce株式会社 フロントエンドエンジニア
浅川