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で電子メールアラートを実装する方法

推薦する

Javascript 構造化代入の詳細

目次1. 配列の分解2. オブジェクトの分解3. 不完全な解体4. 分割代入を使用して変数交換を実装...

HTML テーブルタグチュートリアル (3): 幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、テーブルの幅と高さはコンテンツに応じて自動的に調整されます。テーブルの幅と高さを手動...

Docker クリーニングキラー/Docker オーバーレイ ファイルがディスク領域を大量に占有する

[インターネット上の移行ファイルをすべて見ると、信頼性が低く、症状のみを治療し、根本的な原因を治療し...

vscodeを使用してReact Native開発環境を構築する方法を教えます

質問コードにはプロンプトがありません: RN 開発に不慣れな、フロントエンド以外の学生の多くは、「ど...

Linux で Redis のリモート接続を実装する方法

LinuxにRedisをインストールしたら、Javaを使って接続します。Javaコードは次のとおりで...

モバイル端末のジャンプ問題を解決する(CSS遷移、ターゲット疑似クラス)

序文モバイル端末に触れたばかりの友人の多くは、クリックジャンプルーティング、特にVueルーティングを...

MySQL はどのようにしてマスターとスレーブの一貫性を確保するのでしょうか?

目次MySQLマスタースレーブの基本原理3つのbinlog形式の比較混合形式のバイナリログが存在する...

MySQLは数百万のシミュレーションデータ操作コードを自動的に挿入します

私はデータベースツールとして Navicat を使用しています。他のものも同様です。 1. Navi...

MacにMySQLをインストールするときに初期パスワードを忘れた場合の対処方法

パスワードを忘れると困ります。Mac に MySQL をインストールするための初期パスワードを忘れて...

CentOS での Django プロジェクトのデプロイに関する詳細なチュートリアル

基本環境パゴダ設置サービスパゴダにインストールされた[Pythonプロジェクトマネージャー]パゴダに...

Web データ ストレージ: Cookie、UserData、SessionStorage、WebSqlDatabase

クッキーこれはクライアント ブラウザの状態を保存するための標準的な方法です。Cookie はブラウザ...

継続的インテグレーションテストにおけるDocker Swarmの適用の詳細な説明

背景アジャイル モデルは広く使用されており、テストは特に重要です。新しいバージョンは頻繁にリリースす...

VMware vSphere 6.5 インストール チュートリアル (画像とテキスト)

vmware vSphere 6.5 は vSphere ソフトウェアのクラシック バージョンであ...

Docker コンテナ ソース コードのデプロイ httpd ストレージ ボリュームを使用して Web サイトをデプロイする (推奨)

目次Dockerコンテナのソースコードを使用してhttpdをデプロイし、ストレージボリュームを使用し...