React PR

【超簡単!】ReactとSwapyで作るドラッグ&ドロップ機能

【React】Swapyを使ってドラッグ&ドロップ機能を簡単実装!_サムネイル
記事内に商品プロモーションを含む場合があります

こんにちは!

Reactでドラッグ&ドロップ機能を実装したいけど、難しそう。Swapyを使うと簡単に実装できるみたいだけど、どうやってReactで使うの?実装例を見ながら学びたい。

そんな悩みを抱えているエンジニアの方も多いのではないでしょうか。

この記事では、SwapyのReactでの使い方から具体的な実装例、カスタマイズ方法まで、詳しくご紹介します。

この記事は次のような人におすすめ!
  • Reactでドラッグ&ドロップ機能を簡単に実装したい
  • ReactでSwapyを使ってドラッグ&ドロップ機能を実装する方法が知りたい
  • Swapyの基本的な使い方を知りたい
  • 実際のコード例を見ながらSwapyの実装方法を学びたい

この記事を読めば、SwapyをReactで使用したドラッグ&ドロップ機能の実装方法が分かるだけでなく、具体的なコード例を参考に自分のプロジェクトに応用できるようになりますよ!

「ReactでSwapyを使いたい方」「ドラッグ&ドロップの実装に悩んでいる方」は、ぜひ参考にしてください。

それでは、順を追って詳しく見ていきましょう!

Swapyとは

Swapyとは、Webアプリケーションにドラッグ&ドロップ機能を簡単に実装できるJavaScriptライブラリです。主な特徴としては、以下のようなものがあります。

  • フレームワーク非依存
    React、Vue、Svelteなど、様々なフレームワークで使用できます。
  • シンプルな実装
    少ないコードでドラッグ&ドロップ機能を実現できます。
  • カスタマイズ性
    アニメーションやイベントハンドリングなど、柔軟なカスタマイズが可能です。
  • 軽量
    ファイルサイズが小さく、アプリケーションのパフォーマンスに与える影響が少ないです。

Swapyを使用することで、複雑なドラッグ&ドロップのロジックを自分で実装する必要がなくなり、開発時間を大幅に短縮することができます。

Swapyの基本的な使い方

それでは、SwapyをReactで使用する基本的な方法を見ていきましょう。

Swapyのインストール

まず、プロジェクトにSwapyをインストールします。npmを使用して以下のコマンドを実行します。


npm install swapy

Swapyのインポート

Swapyを使用するReactコンポーネントで、Swapyをインポートします。


import { createSwapy } from 'swapy';

Swapyの初期化

useEffectフック内でSwapyを初期化します。これにより、コンポーネントがマウントされた後にSwapyが正しく設定されます。


useEffect(() => {
  if (containerRef.current) {
    const swapyInstance = createSwapy(containerRef.current, {
      // オプションをここに記述
    });

    // コンポーネントのアンマウント時にSwapyインスタンスを破棄
    return () => {
      swapyInstance.destroy();
    };
  }
}, []);

ドラッグ可能な要素の設定

HTML要素にdata属性を追加して、ドラッグ可能な要素とドロップ先を指定します。


<div className="container" ref={containerRef}>
  <div className="slot" data-swapy-slot="1">
    <div className="item" data-swapy-item="A">A</div>
  </div>
  <div className="slot" data-swapy-slot="2">
    <div className="item" data-swapy-item="B">B</div>
  </div>
</div>

これらの手順を踏むことで、基本的なドラッグ&ドロップ機能をReactアプリケーションに実装することができます。

具体的な実装例

【React】Swapyを使ってドラッグ&ドロップ機能を簡単実装!
ここでは、SwapyをReactで使用した具体的な実装例を見ていきます。この例では、6つの要素(A〜F)をドラッグ&ドロップで並べ替えられるシンプルなレイアウトを作成します。

まず、必要なCSSを用意します。以下の内容をSwapyExample.cssとして保存しましょう。


.container {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.row {
  display: flex;
  gap: 10px;
}

.item {
  display: flex;
  align-items: center;
  justify-content: center;
  background-color: lightblue;
  border-radius: 15px;
  font-size: 24px;
  color: white;
}

.square {
  width: 100px;
  height: 100px;
}

.rectangle {
  width: 200px;
  height: 100px;
}

次に、Reactコンポーネントを作成します。以下の内容をSwapyExample.tsxとして保存しましょう。


import React, { useEffect, useRef } from 'react';
import { createSwapy } from 'swapy';
import './SwapyExample.css';

const SwapyExample: React.FC = () => {
  const containerRef = useRef<HTMLDivElement | null>(null);

  useEffect(() => {
    if (containerRef.current) {
      // Swapyの初期化
      const swapyInstance = createSwapy(containerRef.current, {
        animation: 'dynamic', // スワップ時にアニメーションを追加 ('dynamic', 'spring', 'none')
      });

      // 並び替え後のイベント処理
      swapyInstance.onSwap((event) => {
        event.data.array.forEach(({ slotId, itemId }) => {
          const slotElement = document.querySelector(`[data-swapy-slot="${slotId}"]`);
          const itemElement = document.querySelector(`[data-swapy-item="${itemId}"]`);

          if (slotElement?.classList.contains('square')) {
            // スロットが正方形ならアイテムを正方形にする
            itemElement?.classList.remove('rectangle');
            itemElement?.classList.add('square');
          } else if (slotElement?.classList.contains('rectangle')) {
            // スロットが長方形ならアイテムを長方形にする
            itemElement?.classList.remove('square');
            itemElement?.classList.add('rectangle');
          }
        });
      });

      // コンポーネントがアンマウントされた時にSwapyを破棄
      return () => {
        swapyInstance.destroy();
      };
    }
  }, []);

  return (
    <div className="container" ref={containerRef}>
      {/* ABC の行 */}
      <div className="row">
        <div className="slot square" data-swapy-slot="1">
          <div className="item square" data-swapy-item="A">A</div>
        </div>
        <div className="slot rectangle" data-swapy-slot="2">
          <div className="item rectangle" data-swapy-item="B">B</div>
        </div>
        <div className="slot square" data-swapy-slot="3">
          <div className="item square" data-swapy-item="C">C</div>
        </div>
      </div>

      {/* DEF の行 */}
      <div className="row">
        <div className="slot rectangle" data-swapy-slot="4">
          <div className="item rectangle" data-swapy-item="D">D</div>
        </div>
        <div className="slot square" data-swapy-slot="5">
          <div className="item square" data-swapy-item="E">E</div>
        </div>
        <div className="slot square" data-swapy-slot="6">
          <div className="item square" data-swapy-item="F">F</div>
        </div>
      </div>
    </div>
  );
};

export default SwapyExample;
  • レイアウト
    2行3列のグリッドレイアウトを作成し、各セルにドラッグ可能な要素を配置しています。
  • スロットとアイテム
    data-swapy-slot属性でスロットを、data-swapy-item属性でドラッグ可能なアイテムを指定しています。
  • 形状の変更
    正方形と長方形の2種類の形状があり、ドロップ先のスロットに応じてアイテムの形状が自動的に変更されます。
  • アニメーション
    Swapyのanimationオプションを’dynamic’に設定し、スムーズなスワップアニメーションを実現しています。
  • イベントハンドリング
    onSwapイベントをリッスンし、スワップ中にアイテムの形状を適切に更新しています。

この実装により、ユーザーは要素を自由にドラッグ&ドロップして並べ替えることができ、さらにスロットの形状に合わせてアイテムの形状が自動的に変更されます。

アニメーションのカスタマイズ

Swapyは3種類のアニメーションモードを提供しています'dynamic''spring''none'。これらを切り替えることで、異なる動きを実現できます。


const swapyInstance = createSwapy(containerRef.current, {
  animation: 'spring', // バネのような動きになります
});

スワップ開始、スワップ終了時のイベント

サンプルプログラムではスワップ中(onSwap)でアイテムの形状を変えていましたが、Swapyには他にもスワップ開始(onSwapStart)、スワップ終了(onSwapEnd)時のイベントも用意されています。


useEffect(() => {
  if (containerRef.current) {
    const swapyInstance = createSwapy(containerRef.current, {
      // オプションをここに記述
    });

    swapyInstance.onSwapStart(() => {
      console.log('スワップ開始時のイベント');
    });

    swapyInstance.onSwapEnd(() => {
      console.log('スワップ終了時のイベント');
    });

    ・・・
  }
}, []);

キャリア形成/給与還元
ひとつひとつ真摯に向き合う企業
ONE_WEDGE社員募集

株式会社 ONE WEDGEでは、新たな仲間を募集しています!

私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。

  • 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
  • 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇)を完備!
  • 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
  • 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
  • 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
  • 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
  • ワークライフバランスを重視し、副業もOK!

株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!

ホームページ、採用情報は下記ボタンからご確認ください!

応募、ご質問など、LINEでお気軽にご相談ください♪

まとめ

ここまで、SwapyをReactで使用したドラッグ&ドロップ機能の実装について詳しく見てきました。重要なポイントを改めておさらいしましょう。

  • Swapyは簡単に実装でき、かつカスタマイズ性の高いドラッグ&ドロップライブラリです。
  • ReactとSwapyの組み合わせで、効率的にドラッグ&ドロップ機能を実装できます。
  • 基本的な実装は、Swapyのインストール、初期化、そしてHTMLの構造化だけで可能です。

Swapyを使用することで、複雑なドラッグ&ドロップのロジックを自前で実装する必要がなくなり、開発時間を大幅に短縮できます。また、Swapyを使えば簡単に実装できることがおわかりいただけたかと思います。ぜひ、自分のプロジェクトでSwapyを試してみてください!直感的で使いやすいUIを作る強力なツールになるはずです。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です