【Vue3】 vue.draggable.next で テーブル間ドラッグドロップの UI を実装する

記事タイトルとURLをコピーする

はじめに

こんにちは。アプリケーションサービス部の河野です。
今回は、Vue3 でドラッグ&ドロップの UI を簡単に実装できる vue.draggable.next ライブラリの紹介です。
基本的な使い方から応用編としてテーブル間移動の実装方法について記載します。

実装するもの

開発環境

以下エントリーで記載している環境を前提とします。

blog.serverworks.co.jp

vue.draggable.nextとは?

ドラッグ&ドロップの Vue3 用コンポーネントです。

github.com

任意のリストやテーブルに対して、ドラッグ&ドロップできるUIを追加することが可能です。

デモページから実際の動作を確認することができます。

基本的な使い方

導入

まずは、npm でライブラリをインストールします。(yarn でも可)

npm i -S vuedraggable@next

導入する Vue ファイルにて、インポートします。

import draggable from 'vuedraggable';

コンポーネントは以下のように定義します。

配列の順番も同期されていますね。

プロパティ

よく使いそうなプロパティをざっくり紹介します。

group

group で指定した値が同一のコンポーネント間での移動が可能です。
例えば以下のように複数リストを定義します。group で指定した値が一致しているため、当該コンポーネント間はドラッグ可能になります。

片方の group を 違う値に変更すると、ドラッグできなくなります。

sort

boolean でソート可能(ドラッグ&ドロップで順番を入れ替えることができる)かどうか指定することができます。 (デフォルトは true)

tag

コンポーネントやHTMLタグを指定することで、ドラッグ対象のデータを設定することができます。

デフォルトは div タグが設定されているので、基本的には <template><div> ドラッグする要素 </div></template> で書けばOK。

div タグ

li タグ

move

ドラッグの可否を動的に制御することができます。

例えば、同じ値をドラッグさせたくない場合等に使用できます。

実践

以上を踏まえた上で、複数間テーブルの移動を実装します。
複数テーブル用意して、テーブルのレコード部分を draggable コンポーネントで囲んでいます。
そして、tag に tbody を設定することでテーブル間の移動が可能になります。

Tips

Android でドラッグ対象のテーブル内のコンボボックスが開かない場合

若干マニアックですが、 コンポーネントで囲んだテーブルのセル内にコンボボックスを配置させた時、 Android だけコンボボックスが開かない現象に遭遇しました。

そんな時は、handle オプションで明示的にドラッグするポインターをつけて、コンボボックスを配置しているセルのみ外せば回避できます。

さいごに

本日紹介したライブラリを使用すれば、比較的簡単にドラッグ&ドロップの UI を実装することが可能です。
ぜひ試してみてください!

swx-go-kawano (執筆記事の一覧)