Vueはドラッグアンドドロップを使用して構造ツリーを作成します

Vueはドラッグアンドドロップを使用して構造ツリーを作成します

この記事の例では、ドラッグアンドドロップを使用して構造ツリーを作成するVueの具体的なコードを共有しています。具体的な内容は次のとおりです。

ページの点線のボックス内のノードをドラッグして、以下に示すように右向きの構造ツリーを作成します。

実装のアイデアを記録する:

vueTree.vue

<テンプレート>
  <div class="コンテナ">
    <div class="node-container">
      <div v-for="(item, index) ノードリスト内"
           :key="インデックス"
           クラス="ソースノード"
           ドラッグ可能="true"
           @dragstart="dragStart(アイテム)">
        {{ アイテム }}
      </div>
    </div>
    <div class="ツリーコンテナ"
         @dragover="ドロップを許可"
         @drop="ハンドルドロップ">
      <tree-node v-if="nodeData"
                 ref="ノード"
                 :nodeData="ノードデータ"
                 @delete-node="ツリーを削除" />
    </div>
  </div>
</テンプレート>
<スクリプト>
'./treeNode.vue' から TreeNode をインポートします。
'./config.js' から { Node } をインポートします。
エクスポートデフォルト{
  名前: 'vue-tree'、
  コンポーネント:
    ツリーノード
  },
  // 子孫ノードはノードデータを取得できない、つまり独立してノードを作成できないため、祖先ノードのノード作成メソッドが子孫ノードに公開されます provide() {
    戻る {
      ノードを作成: this.createNode
    }
  },
  データ () {
    戻る {
      ノードリスト: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
      currNode: null、
      ノードデータ: null
    }
  },
  メソッド: {
    // ドラッグを開始し、ノードデータを取得します dragStart (item) {
      this.currNode = アイテム
    },
    // ルートノードが生成されていない場合はドラッグが許可されますallowDrop (event) {
      if (!this.nodeData) {
        イベント.preventDefault()
      }
    },
    //ドラッグ終了、ノード生成 handleDrop() {
      if (!this.nodeData) {
        this.nodeData = this.createNode()
      }
    },
    ノードを作成します(){
      ノード = 新しいノード(this.currNode)
      戻りノード
    },
    // ルートノードを削除し、ツリー全体を削除します deleteTree() {
      this.nodeData = null
    }
  }
}
</スクリプト>
<style lang="scss" スコープ>
。容器 {
  パディング: 20px;
  幅: calc(100% - 40px);
  高さ: calc(100% - 40px);
  .ノードコンテナ{
    高さ: 100px;
    境界線: 1px 破線の赤;
    ディスプレイ: フレックス;
    .ソースノード{
      幅: 50px;
      高さ: 30px;
      背景: #fff;
      境界線: 1px 青
      テキスト配置: 中央;
      行の高さ: 30px;
      マージン: 10px;
      カーソル: ポインタ;
    }
  }
  .tree-container {
    高さ: calc(100% - 122px);
    上マージン: 20px;
  }
}
</スタイル>

設定、js

エクスポートクラスNode{
  コンストラクタ(名前){
    this.name = 名前、
    this.children = []
  }
}

ツリーノード

<テンプレート>
  <!-- 
    構造: 最も外側の層はノードインナーです。各ノードインナーにはノードとノードボックスが含まれます。ノードには現在のノードが格納され、ノードボックスには現在のノードのすべての子ノードが格納されます。現在のノードに複数の子ノードがある場合は、ノードボックスに複数のノードインが存在します。
        <ノード></ノード>
        <ノードボックス>
          <ノード内部>
            <ノード></ノード>
            <ノードボックス>...</ノードボックス>
          </ノードインナー>
          <ノード内部>
            <ノード></ノード>
            <ノードボックス>...</ノードボックス>
          </ノードインナー>
          ...
        </ノードボックス>
      </ノードインナー>
   -->
  <div class="node-inner">
    <div class="node"
         :class="{'drag-over-node': isDragover }"
         @dragover="ドラッグオーバー"
         @dragleave="ドラッグ終了"
         @drop="ノードドロップ">
      <span class="name">{{nodeData.name}}</span>
      <span class="del"
            @click="deleteNode">削除</span>
    </div>
    <div v-show="nodeData.children.length > 0"
         クラス="ノードボックス">
      <tree-node v-for="(item,index) in nodeData.children"
                 :key="インデックス"
                 :nodeData="アイテム"
                 @delete-node="deleteChild(インデックス)" />
    </div>
  </div>
</テンプレート>
<スクリプト>
エクスポートデフォルト{
  名前: 'ツリーノード',
  小道具: {
    ノードデータ: {
      タイプ: オブジェクト、
      デフォルト: () => { }
    }
  },
  // 祖先ノードから渡されたデータを取得する inject: ['createNode'],
  データ () {
    戻る {
      isDragover: false
    }
  },
  メソッド: {
    // ノードはドラッグして子ノードを追加できるようにします dragOver (event) {
      イベント.preventDefault()
      if (!this.isDragover) {
        this.isDragover = true
      }
    },
    ドラッグ終了() {
      if (this.isDragover) {
        this.isDragover = false
      }
    },
    // ノードに子ノードを追加する nodeDrop () {
      ノード = this.createNode() とします。
      this.nodeData.children.push(ノード)
      this.isDragover = false
    },
    // 現在のノードを削除します。これは基本的に、子ノードを削除するために親に渡すことを意味します。deleteNode () {
      this.$emit("ノードを削除")
    },
    // 子ノードを削除する命令を受け取り、削除関数を実行する deleteChild (index) {
      this.nodeData.children.splice(インデックス、1)
    }
  }
}
</スクリプト>
<style lang="scss" スコープ>
.ノード{
  境界線: 1px 実線オレンジ;
  境界線の半径: 4px;
  位置: 相対的;
  ディスプレイ: インラインフレックス;
  アイテムの位置を中央揃えにします。
  コンテンツの両端揃え: スペースの間;
  背景色: #fff;
  高さ: 36px;
  パディング: 0 12px 0 16px;
  行の高さ: 36px;
  下マージン: 10px;
  。名前 {
    フォントサイズ: 16px;
    右マージン: 12px;
  }
  .del {
    色: 赤;
    フォントサイズ: 12px;
    カーソル: ポインタ;
  }
  &.ノード上にドラッグ{
    ボックスの影: 6px 6px 12px rgba(106, 20, 134, 0.15);
  }
}
.ノードボックス{
  ディスプレイ: インラインフレックス;
  flex-direction: 列;
  .node-inner {
    左マージン: 80px;
    // 縦棒をつなげる&:not(:last-child):before {
      位置: 絶対;
      左: -70px;
      上: 22px;
      境界線: 1px 実線オレンジ;
      コンテンツ: "";
      幅: 8px;
      背景色: #fff;
      境界線下部の色: #fff;
      高さ: 100%;
      上の境界線の色: #fff;
      zインデックス: 3;
    }
    // 水平バーを接続&:after {
      左: -61px;
      幅: 60ピクセル;
      コンテンツ: "";
      位置: 絶対;
      上: 14px;
      高さ: 8px;
      境界線: 1px 実線オレンジ;
      コンテンツ: "";
      背景色: #fff;
      右境界線の色: #fff;
      左境界線の色: #fff;
      zインデックス: 3;
    }
    // 最後の縦棒の角は丸い &:nth-last-child(2):before {
      左下の境界線の半径: 6px;
      境界線下部の色: オレンジ;
    }
    // 最初の水平バーが拡張されます &:first-child:after {
      左: -81px;
      幅: 80ピクセル;
      zインデックス: 2;
    }
  }
}
.node-inner {
  位置: 相対的;
}
</スタイル>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Vue ベースのドラッグ可能なツリーテーブルの例の詳細な説明

<<:  MySQLデータベースのロック機構の分析

>>:  XHTML と CSS の Web ページ作成の問題に対する解決策

推薦する

Windows での MySQL 8.0.13 解凍バージョンのインストール グラフィック チュートリアル

この記事では、参考までにMySQL 8.0.13のインストールグラフィックチュートリアルを紹介します...

MySQL マスタースレーブレプリケーションでエラーをスキップする方法

1. 従来のbinlogマスタースレーブレプリケーション、エラー報告をスキップする方法 mysql&...

HTMLはシンプルで美しいログインページを作成します

まずは見てみましょう。 HTML ソースコード: XML/HTML コードコンテンツをクリップボード...

Linux 環境に MySQL 8.0 をインストールするプロセスの紹介

目次序文1. Linux は yum ソースを変更します (MYSQL のインストールが遅い場合は試...

ネイティブjsはショッピングカートのロジックと機能を実装します

この記事の例では、ショッピングカートのロジックと機能を実装するためのjsの具体的なコードを共有してい...

TeamCenter12 にログインする際の 404/503 問題の解決方法

TeamCenter12はアカウントのパスワードを入力し、ログインをクリックすると、404または50...

MySQL の重複データの処理方法 (防止と削除)

一部の MySQL テーブルには重複レコードが含まれている場合があります。重複データが存在することを...

JSの高階関数5つを共有する

目次1. はじめに2. 再帰3. コールバック関数3.1 匿名コールバック関数3.2 パラメータ付き...

よく使われる HTML タグとその特徴の完全なリスト

まず、HTML タグのいくつかの特性を知っておく必要があります。 1. 「<keyword&g...

中国語フォントの英語名まとめ

CSS の font-family プロパティを使用して中国語フォントを参照する場合、フォントを定義...

React Routerの歴史について簡単に説明します

React Router を理解したいなら、まず歴史を理解する必要があります。より具体的には、Rea...

XHTMLはHTMLのいくつかの廃止された要素を使用しなくなりました

CSS ウェブページレイアウトを行う場合、XHTML1.0 仕様に準拠する必要があることは誰もが知っ...

Nginx 正規表現関連のパラメータとルールの紹介

序文最近、私はクライアントのサーバー構成を支援しており、Nginx 構成ファイルを頻繁に変更していま...

この記事は、Dockerにおけるcgroupの具体的な使用法を徹底的に理解するのに役立ちます。

目次cgroupとはcgroupの構成cgroupが提供する機能cgroup 内の CPU を制限す...

Dockerディスク容量不足の問題を解決する

Docker が配置されているサーバーをしばらく稼働させたところ、サーバーのディスク ディレクトリの...