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をインストールする完全なチュートリアル

推薦する

mysqldumpデータエクスポートの問題に関する詳細な議論

1. mysqldump の使用時にエラー (1064) が報告されます。これは、mysqldump...

JS はシンプルなブロック崩しピンボールゲームを実装します

この記事では、ブロック崩しピンボールゲームを実装するためのJSの具体的なコードを参考までに紹介します...

Vueはスクロールバースタイルを実装します

最初はブラウザのスクロールバーのスタイルを変更して効果を実現したいと思っていましたが、情報を調べてみ...

WeChatミニプログラムはどのようにしてユーザー情報とユーザーの電話番号を同時に取得するのか

今日ログインページを書いていたとき、個人情報と携帯電話番号を認証する必要がありましたが、ページにボタ...

純粋な CSS3 で実装された三目並べゲーム

操作効果: html <div class="三目並べ"> <...

Kali に docker と portainer をインストールする方法

dockerの登場により、多くのサービスが徐々にハードウェアアーキテクチャへの依存から脱却しました。...

テーブルタグ(テーブル)詳細

<br />テーブルは、昔から誰もが使ってきたタグで、今も使われています。しかし、現在の...

jsvc を使用して tomcat を起動する方法 (通常のユーザーとして実行)

jsvc の紹介実稼働環境では、Tomcat はデーモン モードで実行する必要があります。Tomc...

MySql クライアントが数秒で終了する問題を解決する (my.ini が見つからない)

問題の説明 (環境: windows7、MySql8.0)今日、MySql をインストールした後、M...

MySQL countの詳細な説明と関数のサンプルコード

mysql countの詳細な説明count関数はテーブルや配列内のレコードを数えるために使われます...

Vueコンポーネントの動的コンポーネントの詳細な説明

目次要約する要約する配列が変更されると、対応するデータを動的にロードしますシナリオ: 異なるコンポー...

JavaScript でグレイウルフのポットビーティングゲームを実装

1. プロジェクト文書 2. ページレイアウトにHTMLとCSSを使用するHTML部分 <di...

Brotli圧縮アルゴリズムを有効にするNginxの実装プロセスの詳細な説明

序文Web アプリケーションでは、トラフィックを節約し、転送データのサイズを縮小し、転送効率を向上さ...

ReactHooks バッチ更新状態とルートパラメータの取得例の分析

目次1. 一括更新の方法コンソール出力2. フックがルーティングパラメータを取得する方法実行効果1....

VueにExcelテーブルプラグインを導入する方法

この記事では、Excelテーブルプラグインを導入するVueの具体的なコードを参考までに共有します。具...