Vueはel-tree遅延読み込みを使用して、追加、削除、変更、クエリ機能を実装します。

Vueはel-tree遅延読み込みを使用して、追加、削除、変更、クエリ機能を実装します。

Vue のツリー表示については、プロジェクトが使用されています: エフェクト ダイアグラムがツリー形式で非同期に表示されます:

ツリー構造表示図

element-ui、el-tree の公式ドキュメントを見つけました。 (アドレス:https://element.eleme.cn/#/zh-CN/component/tree)

プロジェクト要件: 遅延読み込み形式で表示し、ディレクトリには新しい編集および削除操作があり、要件に応じて操作後にツリー構造を更新する必要があります。

それでは、始めましょう。

1つ、

ここに画像の説明を挿入

遅延読み込み: Tree の遅延読み込みは、1 つの属性 lazy によって制御されます。 lazy を使用するには、ロードを使用してレンダリング ツリーのデータをロードする必要があります。この原則では、初期化によってロード関数がトリガーされ、最初に初期データがロードされ、ノードをクリックすると、ロード関数がトリガーされ、このノードの下の子ノードがロードされます。
利点: 大量のデータに適しており、一部のノードの更新に適しています

二、

ここに画像の説明を挿入

カスタムノード: ノードの後に​​アクションボタンを追加します

ここに画像の説明を挿入
ここに画像の説明を挿入

簡単な例については公式サイトに例があります

**

主にノードの更新について話す

**
ノードを編集または削除する場合は、ツリーを更新する必要があります。ツリー全体ではなく、ノードのみを更新する必要があります。
原則: ノードを更新する場合、実際に更新されるのはノード自体ではなく、ノードの子ノードです。このノードの子ノードを削除し、データを再要求してこのノードの子ノード データを取得し、再レンダリングします。

// refreshNode: 更新するノード; newNodeData: 新しい子ノードのデータ refreshNode.splice(0, refreshNode.length);
ノードをリフレッシュします。doCreateChildren(新しいノードデータ)。

次のことを理解してください:
1>.ノードクリックメソッドは、クリックされたノード情報を記録するために menuNodeClick 関数を呼び出します。ノードを操作する前に、まずノードをクリックして選択する必要があります。この関数はノードのクリック イベントをリッスンし、ノードがクリックされている限りトリガーされます。

menuNodeClick(データ、ノード、ツリーノード) {
    this.selectNodeData = データ
    this.selectNode = ノード
}

2>. ノード操作後、ノードを更新します。さまざまなシナリオに応じて、現在のノード (node) を更新するか、現在のノードの親ノード (node.parent) を更新するかを選択できます。

/**
* ノードデータを更新 * @node [node/Object]: ノードを更新、ノード以下のすべてのノードを更新 * @type [String]: ノードタイプ、「node」はノードがツリーのノード情報ノードであることを意味します。「data」はノードがツリーのノード情報のデータであることを意味します */
refreshTreeNode(ノード、タイプ) {
    ノードをリフレッシュします。
    // 更新するノードの子ノードを取得します。if(type === 'node') {
        リフレッシュノード = ノード.childNodes
    }それ以外の場合(type === 'data') {
        getNode = this.$refs.tree.getNode(node) とします。
        リフレッシュノード = getNode.childNodes
    }
    // 元の子ノードを削除します。refreshNode.splice(0, refreshNode.length);
    //データを再要求し、ノードを更新します。this.requestTreeNode(node)
}

3.チェックボックスを選択します。

遅延読み込み中に選択ボックスがある場合は、選択ボックスを含むデータを読み込み、属性default-checked-keysを通じてチェックし、展開されたノードを default-expanded-keys を通じて設定する必要があります。

4. 単一選択:
遅延読み込みにオプションが 1 つしかない場合は、それを選択済みに設定するだけです。

// 現在のノードを選択してこれを設定します。$refs.tree.setCurrentKey(
    this.selectNodeData[this.nodeKey]
)

単一選択、複数選択に関わらず、初めてロードされるとき、背景は選択された情報だけでなく、選択されたノードが配置されているブランチのすべてのノード情報を提供し、ノードが配置されているブランチを上から選択項目まで展開できるように default-expanded-keys に割り当てる必要があります。しかし、多くの場合、バックエンドは選択された値に関する情報のみを提供するため、フロントエンドはデータ自体をカプセル化し、展開する必要があるブランチ情報を取得する必要があります。データ形式に応じて異なる方法が使用されます
1) ツリー型単層データ形式:

[
{...},
{...},
{...}
]

このデータ形式は、[1 つのレイヤーをクリックして、1 つのレイヤーをロードする] と [1 つのレイヤーをクリックして、クリックしたレイヤーの子ノードの複数のレイヤーをロードする] の両方の状況を満たすことができます。最初のケースではデータ処理は必要ありません。2 番目のケースでは、親ノードと子ノードを関連付けるために各データにフィールドを挿入する必要があり、その後、データは el-tree で必要な形式にカプセル化され、再帰関数を使用してデータが統合されます (関連付けられたフィールドが parentId、nodeKey が id、ツリーの子ノード フィールドが children、id が 'N' の子ノードの複数のレイヤーをロードする必要があると仮定) (注: 再帰関数はパフォーマンスに影響を与えるため、注意して使用してください)

2). 多層データ(子ノードの属性名が children であると仮定)

[
    {
        ...、
        子供たち: [
            {
                ...、
                子供たち: [
                    {
                        ...、
                        子供たち: [...]、
                    },
                    {
                        ...、
                        子供たち: [...]、
                    }
                ]
            },
            {
                ...、
                子供たち: [
                    {
                        ...、
                        子供たち: [...]、
                    }
                ]
            }
        ]
    }
    
]

この形式のデータは、単層と多層の両方のシナリオで使用でき、処理は必要ありません。
選択された値は、選択された値が配置されているツリーを統合して拡張します。背景は、マルチレイヤー データに対して選択されたノードが配置されているブランチ全体の値を与え、拡張のためにデフォルトの拡張キーに割り当てることができます。フィルタリングを自分で実行し、再帰関数を記述し、マルチレイヤー データをループして、選択した値を持つノードのブランチを見つけて展開を設定することもできます (nodeKey が id、ツリーの子ノード フィールドが children であり、id が 'N' のノードが配置されているブランチ全体を展開する必要があると仮定)。

遅延読み込みの例:
HTML コントロール:

<el-tree
            :data="ツリーデータ"
            :props="デフォルトプロパティ"
            :load="ノードツリーをロード"
            @node-click="ハンドルNodeClick"
            怠け者
            :クリック時にノードを展開="false"
             :default-expanded-keys="['1']"
            ノードキー="id"
            :ハイライト現在の値="true"
          >
            <span class="custom-tree-node" slot-scope="{ ノード、データ }">
              <span class="treeLeft">{{ node.label }}</span>
              <span class="treeRight">
                <i
                  v-if="node.level === 1"
                  @click="() => appendNode(ノード、データ)"
                  クラス="el-icon-plus"
                  スタイル="色: 青"
                </i>
                <!--グループを追加-->
                <!-- ルートノードは削除したり名前を変更したりする必要はありません-->

                <i
                  v-if="data.id !== 0"
                  @click="() => deleteNode(ノード、データ)"
                  クラス="el-icon-delete"
                  スタイル="色: 赤"
                </i>
                <!--グループを削除-->

                <i
                  v-if="data.id !== 0"
                  @click="() => editNode(ノード、データ)"
                  クラス="el-icon-edit"
                  スタイル="色: 青"
                </i>
                <!--グループ名を変更-->
              </span>
            </span>
          </el-tree>

ビュー:
データ内の変数を定義する

 // ツリーメニュー treeData: [], // ツリーノード defaultProps: { // el-tree のデフォルトデータ配列パラメータを変更します children: 'children',
        ラベル: '名前',
        id: 'id',
        親ID: '親ID',
        isLeaf: 'leaf' // ノードがリーフノードであるかどうかを指定します。これは、lazy 属性が指定されている場合にのみ有効です},

方法:
ツリーメニューセクションをロードする

 // ツリーデータをロードする loadNodeTree(node, resolve) {
      const that = this
      ノードレベル === 0 の場合 {
        that.loadtreeData(ノード、解決)
      } それ以外の場合 (node.level === 1) {
        that.getChildByList(ノード、解決)
      }
    },
    // get loadtreeData は親ノードデータ、getChildByList は子ノードデータを非同期的に取得します loadtreeData(nodeData, resolve) {
      定数データ型 = {
        ページインデックス: 1,
        ページサイズ: 100000
      }
      getAlltype(データ型)
        .then(res => {
          定数ルートChildren = []
          (res.code === 200)の場合{
            定数データ = res.data.list
            データ.map(アイテム => {
              ルートチャイルド.push({
                名前: アイテム.typeName、
                親ID: ''、
                id: アイテム.id、
                葉: 偽、
                子供たち: []
              })
            })
            //resolve にコンテンツがある場合は遅延ロードされてクエリされ、そうでない場合は変更されます if (resolve) {
              解決(ルートの子供)
            } それ以外 {
              ノードデータ.childNodes = []
              nodeData.doCreateChildren(ルートChildren)
            }
          } それ以外 {
            解決する([])
          }
        })
    },
    // 子ノードの取得リクエスト getChildByList(nodeData, resolve) {
      var _parentID = ノードデータ.data.id
      定数型仕様 = {
        タイプID: _親ID、
        ページインデックス: 1,
        ページサイズ: 100000
      }
      getAlltypeSpec(typeSpec).then(res => {
        定数ルートChildren = []
        (res.code === 200)の場合{
          定数データ = res.data.list
          データ.map(アイテム => {
            ルートチャイルド.push({
              名前: アイテム.説明、
              親ID: アイテムタイプID、
              id: アイテム.id、
              葉: 真、
              子供たち: []
            })
          })
          if (解決) {
            解決(ルートの子供)
          } それ以外 {
            ノードデータ.childNodes = []
            nodeData.doCreateChildren(ルートChildren)
          }
        } それ以外 {
          偽を返す
        }
      }).catch(エラー => {
        コンソール.log(エラー)
      })
    },
    // ノードクリックイベント handleNodeClick(data, node) {
      this.addnode = ノード
      this.adddata = データ
      ノードレベル === 1 の場合 {
        this.queryForm.typeId = ノードデータID
        this.queryForm.typeSpecId = ''
      } それ以外の場合 (node.level === 2) {
        this.queryForm.typeId = node.data.parentId
        this.queryForm.typeSpecId = ノードデータID
      }
      this.クエリ()
    },

ノード操作: ノードの追加、ノードの変更、ノードの削除 (自分のノードを操作して親ノード情報を渡して現在のノードを見つけ、子ノードを操作して現在のノードを渡します。結論: 親ノードが子ノードを操作します)

 // ツリーノードに型指定を追加 appendNode(node, data) {
      this.addTypesSpec = {
        タイプ名: ノード.データ.名前、
        タイプID: ノードデータID
      }
      this.createTypesSpecDialog = true
    },
    // ツリータイプの変更 editNode(node, data) {
      定数 typeId = node.data.parentId
      // レベル1型 if (node.level === 1) {
        this.editTypesDialog = true
        this.editTypes = {
          id: ノード.データ.id、
          タイプ名: ノード.データ.名前
        }
      } それ以外 {
        this.editTypesSpecDialog = true
        this.getSelectTypes()
        // this.editTypesSpec = Object.assign({}, node.data)
        this.editTypesSpec = {
          タイプID: タイプID、
          id: ノード.データ.id、
          説明: node.data.name
        }
      }
    },

    // ツリー型の削除 deleteNode(node, data) {
      // レベル1型 if (node.level === 1) {
        this.$msgbox.confirm('この操作によりアセットタイプデータが削除されます。続行しますか?', 'プロンプトの削除', {
          confirmButtonText: '確認'、
          cancelButtonText: 'キャンセル'、
          タイプ: '警告'
        }).then(() => {
          typeDel(ノードデータID)。次に(
            応答 => {
              this.$message('正常に削除されました')
              this.クエリ()
              this.loadNodeTree(ノード.parent)
            },
            エラー => {
              コンソールログ('エラー', エラー)
            }
          )
        }).catch(() => {
          this.$message.error('キャンセルされました')
        })
      } それ以外 {
        this.$msgbox.confirm('この操作により、資産タイプ仕様データが削除されます。続行しますか?', '削除プロンプト', {
          confirmButtonText: '確認'、
          cancelButtonText: 'キャンセル'、
          タイプ: '警告'
        }).then(() => {
          typeSpecDel(node.data.id).then(
            応答 => {
              this.loadNodeTree(ノード.parent)
              this.$message('正常に削除されました')
              this.クエリ()
            },
            エラー => {
              コンソールログ('エラー', エラー)
            }
          )
        }).catch(() => {
          this.$message.error('キャンセルされました')
        })
      }
    },

ノードがトリガーされると、ポップアップ ボックスが表示されます。通常のポップアップ ボックスは、追加、変更、または削除されます。ただし、バックグラウンド リクエストを送信して正常な操作を返した後、ツリー構造を再度読み込む必要があります。そのため、ここでツリーの読み込みメソッドを再度呼び出します。渡されたノードは、ツリーがトリガーされてクリックされたときに保存できます。私のメソッドは handleNodeClick です。このメソッドは、クリックされたノードが変更、追加、または削除されたかどうかに関係なく、そのノードを保存します。

 this.$message('編集に成功しました')
              this.loadNodeTree(this.addnode.parent)

1. 拡張と縮小を設定する

ノードが展開されている場合
    ノードを展開します。
}それ以外 {
    ノードを折りたたむ();
}

2. 親ノードを取得する

ノード.親

理解できるなら読んでください。コードは最適化できますが、最近はあまり時間がありません。理解できなくても、このロジックが理解できれば大丈夫です。また次回

これで、追加、削除、変更、クエリに el-tree 遅延読み込みを使用する Vue に関するこの記事は終了です。Vue el-tree 遅延読み込みに関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue3+ts を使用して管理バックグラウンドを実装する(追加、削除、変更、チェック)
  • Vueはツリー構造の追加、削除、変更、チェックのサンプルコードを実装します
  • Vueは要素を使用して、追加、削除、変更、パッケージ化の手順を実装します。
  • VUE+Elementは、追加、削除、変更、チェックのためのサンプルソースコードを実装します。
  • Vueの追加、削除、変更、チェックの簡単な操作
  • Vueユーザー管理の追加、削除、変更、クエリ機能の詳細な説明

<<:  MySQLプロセス関数の一般的な使用例の分析

>>:  VMware仮想マシンを使用してUbuntu 20.04をインストールする完全なチュートリアル

推薦する

mysql5.7 でユーザーの初期パスワードを変更する方法

ユーザーが初めて MySQL データベースをインストールするとき、初期のルート パスワードを変更する...

MySQLデータベースのマスタースレーブレプリケーションの長い遅延に対する解決策

序文MySQL マスター スレーブ レプリケーションの遅延は、業界では長年の問題となっています。遅延...

MySql における無効な Null セグメント判定と IFNULL() 失敗の解決策

MySql Nullフィールド判定とIFNULL失敗処理ps: (プロセスを表示したくない場合は、S...

React Nativeでaxiosを使用してネットワークリクエストを行う方法

フロントエンド開発では、Ajax、jQuery ajax、axios、fetch など、データ要求を...

Ubuntu でパスワードを変更し、パスワードの複雑さのポリシーを設定する方法

1. パスワードを変更する1. 一般ユーザーのパスワードを変更する パスワード現在のパスワードを入力...

インタラクティブな視覚化 JS ライブラリ gojs の使い方の紹介とヒント

目次1. gojsの紹介2. Gojsのアプリケーションシナリオ3. gojs を選ぶ理由: 4. ...

ウィンドウ環境で VScode を使用して仮想マシン MySQL に接続する方法

1. 仮想マシン側1. MySQLの設定ファイルを見つける:sudo vim /etc/mysql/...

Linux でディスクをマウントし、起動時に自動的にマウントするように設定する方法

皆さんの時間は貴重だと承知しているので、プロセス コマンドを直接書き留めておきます。設定できます。原...

VMware 仮想マシンのインストール win7 オペレーティング システム チュートリアル ダイアグラム

VMwareaのインストールプロセスは説明しませんが、主にwin7イメージをロードする方法を説明しま...

Nginx イントラネット スタンドアロン リバース プロキシの実装

目次1 Nginxのインストール2 Nginxの設定3 ホストファイルを変更する4 テストNginx...

CSSのborder-radiusプロパティを使用して円弧を設定します

現象: divを一定の振幅で円、楕円などに変更する方法: CSSのborder-radiusプロパテ...

Vue3 を使用してポップアップ コンポーネントをカプセル化するのは簡単ですか?

目次最初に要約: 🌲🌲 序文: 🍬🍬公開🍬🍬 🍬🍬グローバル🍬🍬 🍬🍬ボールボックス🍬🍬 🎉🎉🎉結論...

VMware での Linux CentOS6.9 インストール グラフィック チュートリアル

技術初心者として、初めて Linux システムをインストールするプロセスを記録しています。まず、Wi...

ウェブサイトにダークモード切り替え機能を持たせるための純粋なCSSフリー実装コード

序文ダーク モードの概念は、 MacOS系統のMojaveに由来し、ユーザーが選択できる 2 つのス...