Vueはドラッグ可能なツリー構造図を実装します

Vueはドラッグ可能なツリー構造図を実装します

最近、Vue を使用して、ドラッグ可能なツリー構造図という小さなプロジェクトを作成しました。

Vue 再帰コンポーネント

この構造はVueの再帰コンポーネントを通じて実装されている。

レイアウトはフレックスを使用し、構造線はCSS疑似クラスによって実装されています。

注意すべき点は、中央揃えレイアウトの場合、X 軸上の要素が多すぎて子要素の幅がビューを超えてしまうと、要素が中央揃えされた後にスクロール バーはあるものの、右側のコンテンツにしか届かず、左側のコンテンツにはアクセスできなくなることです。親要素を inline-flex に設定し、幅を auto に設定することができます。もちろん、上記のような構造であれば、このような問題は発生しませんが、ビッグデータのレンダリングとなると、やはり午後は悩みました。

ドラッグイベント

まず、ドラッグしたい要素にドラッグ可能な属性をバインドします。デフォルトでtrueに設定されている<a>タグと<img>タグを除き、他のすべての要素は次のように設定する必要があります。

次に、 dragenddragoverdrop 3 つのイベントがあります (Vue で記述されているため、イベントの前に追加しないでください)。

dragoverではデフォルトの動作を削除し、イベントに$event.preventDefault()を指定する必要があることに注意してください。そうしないと、ドラッグ時にマウスに 🚫 記号が表示され、ドラッグが無効になります。

ドラッグされた要素の値をドロップされた場所に転送するには、 $event.dataTransfer.setData("node", transNodeData)を使用する必要があります。

"node"は渡されるデータの変数名と同等であり、 JSON.stringify()である必要があります。

方法:{
    ドラッグスタート(e,nodeObj){
      console.log('🐉ドラッグ移動ポイント',nodeObj.name,);
      let transData = JSON.stringify(nodeObj) //ドラッグによって渡されたデータはまずJSON形式に変換されます e.dataTransfer.setData("node", transData)
    },
    ドラッグオーバー(e){
      e.preventDefault()
    },
    ドロップ(e,nodeObj){
      console.log('🐉dropped to',nodeObj.name);
      getData = JSON.parse( e.dataTransfer.getData("node")) とします。
      console.log('データを取得',getData);
    }
  }

これを踏まえて、次にやるべきことは、取得したドラッグポイントデータを配置ポイントのchildren配列に入れ、 dragendイベントで親ノードのchildren配列からドラッグポイントを削除することです。ノードのインデックスは、 dragstartイベントがトリガーされたときに取得され、 eventBusコンポーネント通信メソッド ( Vuexも使用可能) を介してdragendに渡されます。

バスフォルダを作成し、新しいindex.jsファイルを作成します。

「vue」からVueをインポートします
定数busEvent = 新しいVue({
  データ(){
    戻る {
      dragNodeIndex:-1, //親ノードの子配列内のドラッグノードのインデックス
    }
  },
  作成された(){
    this.$on("transDragNodeIndex", res=>>/$on を通じて $emit を監視するには、カスタム イベントがトリガーされる前に監視されていることを確認する必要があります。つまり、サブスクリプションがパブリッシュに先行します。そうしないと、データを監視できません。私は eventBus をあまり使用していないので、これは落とし穴です。this.dragNodeIndex=res
    })
  }
})

デフォルトの busEvent をエクスポートする

コンポーネントにeventBusを導入します。dragstart で$emit介してカスタム イベントをトリガーした後、 $onこのデータを受信できます。dragend dragendeventBusを介してこのインデックスを取得し、配列から削除できdragstart

次のステップは、いくつかの論理的判断を下すことです。たとえば、親ノードを子ノードにドラッグできない場合は、まず親ノード上のすべての子ノードの名前を再帰的に走査して配列に格納します。ドロップ位置のnameが配列内にある場合、親が子にドロップされていることを意味し、状態は true に設定されます。

ifFatherDragToSon(dragObj,dropObj){//親ノードが子ノードに移動したかどうかを判断しますif (dragObj.children.length === 0) false を返します。
      newArr = [] とします。
      関数 getAllName(dragObj) {
        新しいArr.push(...dragObj.children);
        (dragObj.children.length === 0)の場合{
          戻る;
        } それ以外 {
          (i = 0 とします; i < dragObj.children.length; i++) {
            getAllName(dragObj.children[i]);
          }
        }
      }
      getAllName(ドラッグオブジェクト);
      newArr.includes(dropObj) の場合 {
        true を返します。
      }
      false を返します。
    }

eventBusを使用してdragendイベントのステータスを取得し、それがtrueの場合は直接返します。

自分自身にドラッグしても機能せず、直接戻るだけです。 「Li Hu Chong」ポイントの下に子ノードが追加されます。これは主に、 name属性に基づくのではなく、スタック内のノードのアドレスが判断に使用されることを確認するためです。

もう一つ特筆すべきは、ドラッグイベントの$event.dataTransfer.dropEffectです。取得できる値はmovecopynonelinkです。下図では、 dropEffectが🚫のとき、ドラッグポイントが消えます。実は、 dragendイベントのコードは実行されるのに対し、 dropイベントのコードは実行されないので、このステップではまずプロセス制御が必要です。さらに、360 ブラウザなど、異なるブラウザのデフォルトのdropEffectも異なります。

コード接続

以上がVueのドラッグ可能なツリー構造図の実装の詳細内容です。Vueのツリー構造図の実装の詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Vue の一時停止されたドラッグ可能なフローティング ボタンのサンプル コード
  • vue draggable resizable はドラッグ可能なスケーリングのコンポーネント機能を実現します
  • Vueは、element-uiダイアログボックスのドラッグ可能な機能を実装します。
  • Vueはechartsを使用して組織図を描画します
  • Vueカスタムツリー構造図を実装する方法

<<:  Mysql 5.7.19 無料インストール バージョンで遭遇した落とし穴 (コレクション)

>>:  Zabbixで電子メールアラートを実装する方法

推薦する

MySQL マスタースレーブレプリケーションの遅延の原因と解決策

目次レプリケーション ロジックの簡単な概要:遅延の原因と解決策〇メインデータベースへの頻繁なDMLリ...

cmd と python での MySQL の一般的な操作についての簡単な説明

環境設定1: MySQLをインストールし、MySQLのbinディレクトリを環境変数に追加する環境設定...

Ubuntu 18.04 向け VMware Tools のインストールと構成のチュートリアル

この記事では、Ubuntu 18.04でのVMware Toolsのインストールと設定について記録し...

Dockerコンテナ間の通信と外部ネットワーク通信の操作

コンテナ間の通信1. コンテナのネットワーク共有このモードの Docker コンテナはネットワーク ...

JavaScript でローカル変数をグローバル変数に変換する方法

まず関数の自己呼び出しを知る必要がある関数の自己呼び出し - 自己呼び出し関数1 回限りの関数 - ...

Elementのメッセージポップアップウィンドウが繰り返しポップアップする問題の解決

目次1. 使用2. メッセージポップアップウィンドウが繰り返し表示される問題を解決する1. 使用Vu...

Vueは画像のドラッグアンドドロップ機能を実装します

この記事の例では、画像のドラッグアンドドロップ機能を実現するためのVueの具体的なコードを参考までに...

vscodeを使用してuniappを開発する方法

私はフロントエンド プロジェクトの開発に常に vscode を使用してきたため、現在ではいくつかの小...

デザイナーが再びハマーの公式サイトに不満を述べる

昨年、この公開書簡は大ヒットし、羅永浩氏を驚かせた。今日、著者が新しい章を発表するとは思ってもみなか...

コンテンツウェブページの画像プレビューのデザイン

<br />以前、「コンテンツページ番号のプレビューナビゲーション」と「写真プレビューナ...

Node.js管理ツールnvmの詳細なインストール手順

いいえnvmはnodejsの複数のバージョンを管理する役割を担っています。インストール: https...

MySQL 分離列とプレフィックスインデックスの使用の概要

目次データ列を分離するプレフィックスインデックスとインデックスの選択性データ列を分離するMySQL ...

アバター変更機能を実装するJavaScript

この記事では、アバター変更機能を実装するためのJavaScriptの具体的なコードを参考までに共有し...

MySQL IN ステートメントにおける低速クエリの効率を最適化する手法の例

表の構造は以下のとおりです。記事数は690件のみです。 記事テーブル article(id,titl...

Linux で Apache を使用してファイル サーバーを構築する手順

1. ファイルサーバーについてプロジェクトでは、公開ソフトウェアやデータをプロジェクト チーム メン...