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データベースについて学びましょう

推薦する

dubbo での Zookeeper リクエストのタイムアウト問題: mysql8.0.15 に接続する mybatis+spring の構成

ここ2日間Javaを復習するつもりなので、練習にdubboを使ってショッピングモールプロジェクトを書...

WeChat 8.0の爆発的な特殊効果を実現するために300行以上のCSSコードが必要

WeChat 8.0 アップデートの主な特徴は、アニメーション絵文字のサポートです。送信するメッセー...

MySQLデータベースバックアップのさまざまな実装方法の概要

この記事では、MySQL データベースのバックアップを実装するさまざまな方法について説明します。ご参...

CSS のオーバーフロー:hidden エラーの解決方法

失敗の原因今日、カルーセルを書いていたときに、overflow;hidden; が失敗する可能性があ...

Ubuntu で apt-get を使用して mysql をインストールおよび完全にアンインストールする方法の詳細な説明

1. mysqlをインストールします。 udo apt-getでmysql-serverをインストー...

Reactにおける不変値の説明

目次不変の値とは何ですか?不変の値を使用するのはなぜですか? Reactのパフォーマンス最適化は不変...

パスワードログインなしのLinux構成スタンドアロンおよびフルディストリビューションの詳細なチュートリアル

目次1: 単一マシンのパスワードフリーログイン構成1. 仮想マシンのホスト名を設定する2. 仮想マシ...

ハイパーコネクションの4つの状態の適用の詳細な説明

ブラウザの問題かもしれないと思うかもしれませんが、スタイル定義の順序が間違っている可能性が高いです。...

HTML タグのメタ概要、HTML5 のヘッド メタ属性の概要

序文metaはhtml言語のhead領域にある補助タグです。おそらく、これらのコードは不要だと思うで...

Vueコンポーネントドキュメントを自動生成する方法を分析する

目次1. 現状2. コミュニティソリューション2.1 事業レビュー3. 技術的ソリューション3.1....

Vue3 + TypeScript 開発の概要

目次Vue3 + TypeScript 学習1. 環境設定1.1 最新のVue scaffoldin...

CSS 属性セレクタを使用して HTML DNA を接合する方法

CSS 属性セレクターは素晴らしいです。大量のクラス名を追加することを回避し、コード内の問題を指摘す...

HTML知識ポイントの実践経験のまとめ

1. 表タグはtable、trは行、tdはセル、cellspacingはセル間の距離、cellpad...

Linux でファイルを削除するときに「操作は許可されていません」というプロンプトが表示される場合の対処方法

同僚からよく聞かれるのですが、ファイル/ディレクトリを削除すると「操作は許可されていません」というエ...

vue3 を使用したジグソーパズルゲームのリファクタリングの例

序文プロジェクト内のパズルゲーム(デジタル華容路とも呼ばれる)を再構築するのに 2 日かかりました。...