Vue ドラッグ アンド ドロップのシンプルな実装

Vue ドラッグ アンド ドロップのシンプルな実装

この記事では、主に次のような Vue ドラッグ アンド ドロップの簡単な実装を紹介します。

レンダリング

重複は判定されず、古いデータは削除されません。

データ本体

 <MyShuttle:dataOrigin='[
          {
            名前:「データ001」
            ID: "番号 001",
          },
          {
            名前:「データ002」
            ID: "番号 001",
          },
          {
            名前:「データ003」
            ID: "番号 001",
          }]' 
          
      :スペース='[{
            名前:"右001",
            ID:"右 001",
            }]' />

コード

ドラッグ可能 ドラッグ可能を有効にする

フォロー
// ブラウザがデフォルトでこの動作をしないようにします。そうしないと、クロスが表示され、見栄えが悪くなります。

デフォルトの動作を防ぐ

@dragleave.stop="dragleave($event, 'main')"

現在の要素に入ると、

@dragend.stop="dragEnd($event, item)"

ドラッグコンテンツトリガーをドロップする

ドラッグイベントとプロパティ

マークこれは非常に重要です!!! これにより、ドラッグ イベントの動作が決まります。クリックしてドラッグを開始すると、マウスがクリックされた場所がマーカーになります。
dragstart: マウスをクリックして移動したときに実行されます。
drag: dragstart が実行されると、マウスが動いている間は継続的にトリガーされます。
dragend: ドラッグ動作が終了したとき、つまりマウスが放されたときにトリガーされます。
dragenter: ドラッグされている要素のマーカーが DOM 要素に入るとトリガーされ、最初にトリガーされます。入力された DOM 要素がこのイベントをトリガーします。
dragover: ドラッグされた要素のマーカーが着信 DOM 要素上で移動したとき、および要素自体が移動したときにトリガーされます。
dragleave: ドラッグされた要素が入力された DOM から離れた時にトリガーされます。

H5 ドラッグ属性 ドラッグ可能

draggable: 要素をドラッグ可能にする必要がある場合は、true に設定する必要があります。デフォルト値は false です。デフォルトでは、選択したテキスト、画像、リンクをドラッグできます。
DataTransfer オブジェクト: このプロパティは、ドラッグ アンド ドロップされたデータとインタラクション情報を保存するために使用されます。このコンポーネントでは使用されず、一時的に無視されます。

マウスが対象の div ボックスに移動すると、追加されます。単純な例で問題を最もよく説明できます。

<テンプレート>
  <div class="MyShuttle">
    <div class="MyShuttleLeft">
      <div class="title">データソース</div>
      <div class="dataBox" @dragleave.stop="dragleave($event, 'main')">
        <div v-for="(item, i) in dataOrigin" :key="i" class="dataList" draggable @dragenter.prevent
          @dragover.prevent @dragstart.stop="dragstart($event, item)"
          @dragend.stop="dragEnd($event, item)">
          {{item.Name}}
        </div>
      </div>
    </div>
    <div class="MyShuttleCenter"></div>
    <div class="MyShuttleRight">
      <div class="title">データソース</div>
      <div ref="MyShuttleRight" class="dataBox">
        <div v-for="(item, i) in spaceList" :key="i" class="dataList" draggable @dragenter.prevent
          @dragover.prevent>
          {{item.Name}}
        </div>
      </div>
    </div>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: ''、
  コンポーネント: {},
  小道具: {
    データオリジン: {
      タイプ: 配列
    },
    空間: {
      タイプ: 配列
    }
  },
  データ() {
    戻る {
      スペースリスト: this.space,
      ドラッグステータス: false
    }
  },
  計算: {},
  時計: {}、
  作成された() { },
  マウント() { },
  メソッド: {
    ドラッグリーブ(e, アイテム) {
      // コンソール.log(e, アイテム)
      if (item === 'main') {
        this.isDragStatus = true
      } それ以外 {
        this.isDragStatus = false
      }
      // コンソールログ(this.isDragStatus)
    },
    ドラッグスタート(e, アイテム) {
      // コンソール.log(e, アイテム)
    },
    ドラッグ終了(e, 項目) {
      const top = this.$refs.MyShuttleRight.getBoundingClientRect().top
      const 右 = this.$refs.MyShuttleRight.getBoundingClientRect().右
      定数 bottom = this.$refs.MyShuttleRight.getBoundingClientRect().bottom
      const 左 = this.$refs.MyShuttleRight.getBoundingClientRect().左
      console.log(上、右、下、左)
      console.log(e.clientX, e.clientY, アイテム)
      if (this.isDragStatus && e.clientY > 上 && e.clientY < 下 && e.clientX > 左 && e.clientX < 右) {
        this.spaceList.push(アイテム)
        console.log(this.spaceList.indexOf(item))
      }
    }
  }
}
</スクリプト>

<スタイル スコープ lang="scss">
.マイシャトル{
  幅: 100%;
  高さ: 308px;

  ディスプレイ: フレックス;
  コンテンツの両端揃え: スペースの間;
  // 左と右のボックスの共通スタイル。MyShuttleLeft、
  .MyShuttleRight {
    境界線: 1px 実線 #dddddd;
    境界線の折りたたみ: 折りたたみ;
    。タイトル {
      ボックスのサイズ: 境界線ボックス;
      幅: 100%;
      高さ: 40px;
      背景: #f5f5f5;
      境界線の半径: 4px 4px 0px 0px;
      border-bottom: 1px 実線 #dddddd;
      パディング: 10px 16px;
      フォントサイズ: 14px;
      フォントファミリー: PingFangSC-Regular、PingFang SC;
      フォントの太さ: 400;
      色: #333333;
      行の高さ: 20px;
    }
    .データボックス{
      幅: 100%;
      高さ: 228px;
      オーバーフロー:自動;
      パディング: 6px 0;
      .データリスト{
        幅: 96%;
        高さ: 40px;
        ボックスのサイズ: 境界線ボックス;
        フォントサイズ: 14px;
        フォントファミリー: PingFangSC-Regular、PingFang SC;
        フォントの太さ: 400;
        色: #666;
        行の高さ: 20px;
        マージン: 0 2% 10px;
        パディング: 10px 16px;
        境界線: 1px 実線 #ddd;
        境界線の半径: 4px;
        ユーザー選択: なし;
        カーソル: ポインタ;
        &:ホバー{
          色: #01bc77;
          背景: rgba(1, 188, 119, 0.1);
        }
      }
    }
  }
  .MyShuttleLeft {
    幅: 362ピクセル;
    高さ: 100%;
    背景: #ffffff;
    境界線の半径: 4px;
  }
  .MyShuttleCenter {
    幅: 64ピクセル;
    高さ: 100%;
  }
  .MyShuttleRight {
    幅: 362ピクセル;
    高さ: 100%;
    背景: #ffffff;
    境界線の半径: 4px;
  }
}
</スタイル>

これで、vue ドラッグ アンド ドロップ追加の簡単な実装に関するこの記事は終了です。より関連性の高い vue ドラッグ アンド ドロップ追加のコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue ベースのドラッグ アンド ドロップ機能を実装する
  • Vueをベースにドラッグ効果を実現
  • Vue.Draggable ドラッグ機能の設定と使用方法
  • Vue.Draggableはドラッグ効果を実現します
  • Vue をベースにスムーズな遷移のドラッグ アンド ドロップ ソート機能を実装する
  • Vue カスタム ディレクティブ ドラッグ関数の例
  • Sortable.js を使用して vue2.0 に実装されたドラッグ アンド ドロップ機能の例
  • Vue ベースのドラッグ可能なツリーテーブルの例の詳細な説明
  • Vue がドラッグ プログレス バーのスライド コンポーネントを開発

<<:  HTMLのマーキータグは、シームレスなスクロールマーキー効果を実現します。

>>:  MySQLデータベースについて学びましょう

推薦する

Tomcat でのサーブレットの作成と実装に関する深い理解

1. サーブレットとは何か1.1. 正式な言葉で説明する:サーブレットは、動的な Web リソースを...

MySQL のロックに関する問題

ロックの分類:データ操作の粒度から:テーブルロック:操作時にテーブル全体がロックされます。行ロック:...

テーブルタグ(テーブル)詳細

<br />テーブルは、昔から誰もが使ってきたタグで、今も使われています。しかし、現在の...

Javascript で関数のカリー化とデカリー化を実装する方法

関数のカリー化(黒い疑問符の顔)? ? ?カレー(黒い疑問符の顔)? ? ?これは完璧な中国語翻訳で...

WeChatミニプログラムでのマップの正しい使用例

目次序文1. 準備2. 実際の戦闘2.1 ミニプログラムの権限を設定する2.2 カプセル化ツールの機...

CentOS7にNginxをインストールして自動起動を設定する方法

1.公式サイトからインストールパッケージをダウンロードするhttp://nginx.org/en/d...

シンプルなショッピングカート機能を実現するjs

この記事の例では、簡単なショッピングカート機能を実現するためのjsの具体的なコードを参考までに共有し...

MySQL データベースのホットスタンバイにおける問題点の分析

以前、MySQL データベースのデュアルマシン ホット スタンバイの設定方法を紹介しました。ご興味の...

ウェブページの色特性の分類

色特性の分類あらゆる色は、赤、緑、青の三原色から構成されます。三原色の中で暖色なのは赤だけなので、作...

メタタグの詳しい説明(メタタグの役割)

個人のウェブサイトがどんなに素晴らしいものであっても、サイバースペースの広大な海に浮かぶ小さなボート...

Linuxでディレクトリを効率的に切り替える方法

Linux でディレクトリを切り替えるとなると、誰もが間違いなくcdコマンドを思い浮かべるでしょう。...

vue3.0 プロジェクトを素早く構築するための手順を完了する

目次1. 3.0をより適切にサポートするには、vue/cliのバージョンが4.5.0以上であることを...

CentOS7におけるKVM仮想化の基本管理の詳しい説明

1. kvm仮想化をインストールする : : : : : : : : : : : : : : : :...

CSS3 アニメーション ボールローリング JS コントロールアニメーション一時停止

CSS3 はアニメーションを作成でき、多くの Web ページのアニメーション画像、Flash アニメ...

MySQL Server 8.0.13.0 インストールチュートリアル(画像とテキスト付き)

MySQL 6.1.3 をベースにした 8.0.13 をインストールします。 MySQL 8.0....