Vueはツリー構造の追加、削除、変更、チェックのサンプルコードを実装します

Vueはツリー構造の追加、削除、変更、チェックのサンプルコードを実装します

実は多くの会社がユーザー権限ツリーに似た機能を持っています。最近、追加、削除、修正のツリー構造を書きました。ここで皆さんと共有したいと思います。無理なところがあればコメントしてください。できるだけ早く最適化します。まずは効果画像を添付してください。

これは、編集がクリックされていない場合です。製品要件は、ノードを選択して、ノードに対応するデバイスデータを取得することであるため、初期ページは次のようになります。

ここに画像の説明を挿入

これは編集をクリックした後に表示されるノードの編集ボタンです

ここに画像の説明を挿入

一番上の追加ボタンをクリックすると、最も外側の親ノードの追加画面が表示されます。

ここに画像の説明を挿入

ノード名を変更する

ここに画像の説明を挿入

私たちの要件は編集と非編集の 2 つの状態であるため、2 つのツリー コンポーネントを使用し、v-if を通じてそれらを制御しました。 (v-if: コンポーネントが存在しない、v-show: コンポーネントはスペースを占有するが表示されません)

<el-tree
    v-if="treeSetData.editFlg"
     ref="木"
     :key="treeSetData.tree_key"
     :data="treeSetData.treeData"
     ノードキー="id"
     :render-content="レンダリングコンテンツ"
     :クリック時にノードを展開="false"
     :default-expand-all="treeSetData.defaultExpandAll"
     ハイライト-現在
     @node-click="ハンドルNodeClick"
     クラス="ツリースタイル"
 </el-tree>
 <el-tree
     v-else
     ref="木"
     :key="treeSetData.tree_key"
     :data="treeSetData.treeData"
     ノードキー="id"
     :render-content="レンダリングコンテンツ"
     :クリック時にノードを展開="false"
     :default-expand-all="treeSetData.defaultExpandAll"
     ハイライト-現在
     クラス="ツリースタイル"
 </el-tree>

ツリーコンポーネントのフィールドについてはここでは詳しく説明しません。element-ui ツリーコンポーネント公式サイトで確認できますが、以下のメソッドについては別途説明します。

  • render-content: カスタム ノード コンテンツ、renderContent: はメソッド名です。
  • @node-click: ノードがクリックされたときに呼び出されます。ノードクリック効果は非編集状態でのみ存在するため、このメソッドは非編集ツリーコンポーネントにのみ記述しました。

必要なデータの説明

// ツリー構造に必要なデータtreeSetData:{
  defaultExpandAll:true, // デフォルトで展開するかどうか editFlg:true, // 編集状態かどうか treeData: [], // ツリーコンポーネントデータセット // ツリー配列の内容を編集 editList:[],
  // ツリーデータ配列の内容を削除します deleteList:[],
  // ツリーデータ配列コンテンツを追加 addList:[],
  // フラグを追加するかどうか
  addNodeFlg:false、
  //デフォルトID
  デフォルトID:5000、
  // 新しく追加された最外部ノード名 newName:'',
  ツリーキー: 0,
},

最も外側のノードを追加する方法を説明します。実際には、入力ボックスとボタンの表示を制御し、確認ボタンをクリックした後に元のツリー コンポーネント データに新しいデータを追加することが核心的な考え方です。

実現画面

ここに画像の説明を挿入

ボタンのHTMLコードを追加

<el-button type="text" @click="add_new_Area" class="button-style"><i class="el-icon-plus" style="margin-right:5px"></i>追加</el-button>

ボタンクリックメソッドの追加 [add_new_Area]

新しいエリアを追加します(){
      this.treeSetData.addNodeFlg = true;
    },

テキストボックスのコードスニペット

<el-row class="add_question" v-show="treeSetData.addNodeFlg">
    <el-col :span="11" style="margin:0px 5px">
         <el-input v-model="treeSetData.newName" placeholder="通路エリア" size="mini"></el-input>
     </el-col>
     <el-col :span="12">
         <el-button size="mini" type="primary" plain @click.stop="add_area_sure">OK</el-button>
         <el-button size="mini" type="warning" plain @click.stop="add_area_cancel">キャンセル</el-button>
     </el-col>
 </el-row>

確認ボタン [add_area_sure]

add_area_sure() {
// ノードデータを追加します。最上位層なので、デフォルトの親IDはpidです。idは初期化で設定した[defaultId]を自分で追加したものです。データに[defaultId]フィールドを自分で追加することもできます。const nodeObj = {
    id: this.treeSetData.defaultId++,
    名前: this.treeSetData.newName、
    isEdit: false、
    子供たち: []、
    プロセスID:0
  };
  ツリーデータを設定します。
  this.treeSetData.addNodeFlg = false;
  this.treeSetData.addList.push(nodeObj);
},

キャンセルボタン [add_area_cancel]

add_area_cancel() {
  this.treeSetData.addNodeFlg = false;
  this.treeSetData.newName = "";
},

この時点で、最も外側のノードを追加できます。

編集状態の追加、削除、変更は、実際にはカスタムノードコンテンツの[renderContent]メソッドを通じて実装されます。仕事が終わるので、一つ一つ説明することはしません。時間があるときに補います。まずはメインコードを紹介します〜

// エリアツリー操作グループノードを渡す、
    レンダリングコンテンツ(h, { ノード, データ, ストア }) {
        if(this.treeSetData.editFlg == false){
            戻る (
                <span class="tree-span">
                    <span>{this.showOrEdit(データ)}</span>
                    <div class="tree_node_op">
                        <i class="el-icon-edit" on-click={ev => this.nodeEdit(ev, store, data)} style="padding-left: 10px;"></i>
                        <i class="el-icon-circle-plus" on-click={() => this.nodeAdd(node, data)} style="margin-left: 5px;"></i>
                        <i class="el-icon-remove" on-click={() => this.nodeDelete(node, data)} style="margin-left: 5px;"></i>
                    </div>
                </span>
            );
        } それ以外 {
            戻る (
                <span class="tree-span">
                    <span>{this.showOrEdit(データ)}</span>
                    <div class="tree_node_op">
                    </div>
                </span>
            );
        }
    },

    // ノード編集 showOrEdit(data) {
      if (data.isEdit) {
        戻る (
          <el-入力
            タイプ="テキスト"
            値={データ名}
            オンブラー={ev => this.edit_sure(ev, データ)}
            サイズ="ミニ"
            クラス="入力スタイル"
          </el-input> ...
        );
      } それ以外 {
        <span className="node_labe">{data.name}</span> を返します。
      }
    },
    ノード編集(ev, ストア, データ) {
      データを編集するには
      this.$nextTick(() => {
        定数$入力 =
          ev.target.parentNode.parentNode.querySelector("入力") ||
          ev.target.parentElement.parentElement.querySelector("入力");
        !$input ? "" : $input.focus();
      });
    },

    // 編集を確認する edit_sure(ev, data) {
        定数$入力 =
            ev.target.parentNode.parentNode.querySelector("入力") ||
            ev.target.parentElement.parentElement.querySelector("入力");
        もし(!$input){
            false を返します。
        } それ以外 {
            データ名 = $input.value;
            データ編集
        }
        // 編集ツリーデータの内容を変更します。let editFilter = this.treeSetData.editList.filter((item)=>item.id == data.id);
        (editFilter.length == 0)の場合{
            this.treeSetData.editList.push(データ);
        } それ以外 {
            this.treeSetData.editList.forEach((item,i)=>{
                if(item.id == data.id) {
                    this.treeSetData.editList[i].name = データ.name;
                }
            })
        }
    },

    // ノードを追加 nodeAdd(node, data) {
      (data.pid !== 0)の場合{
        this.$message({type:'error',message:'アクセス領域には最大 2 つの階層レベルを設定できます。'});
        false を返します。
      } それ以外 {
          const newChild = { id: this.treeSetData.defaultId++, name: '新しく追加されたアクセス領域', isEdit:false, pid:data.id, children: [] };
          if (!data.children) {
            this.$set(データ, 'children', []);
          }
          データ.children.push(新しい子);
          this.treeSetData.addList.push(newChild);
      }
    },

    // ノードの削除 nodeDelete(node, data) {
      this.treeSetData.deleteList.push(データ);
      定数親 = ノード.parent;
      const children = parent.data.children || parent.data;
      const index = children.findIndex(d => d.id === data.id);
      children.splice(インデックス、1);
    },

次に、処理したデータ(追加するデータ:addList、変更するデータ:editList、削除するデータ:deleteList)をデータベース処理のためにバックグラウンドに送信しますが、以下の状況に注意する必要があります。

// 最初に追加し、次にデータ統合を変更します this.treeSetData.addList.forEach((item,i)=>{
    editFilter を this.treeSetData.editList.filter((value)=>value.id == item.id) とします。
    (editFilter.length !== 0)の場合{
        this.treeSetData.addList[i] = editFilter[0];
        this.treeSetData.editList = this.treeSetData.editList.filter((value)=>value.id !== item.id);
    }
})
// 最初にデータ統合を追加し、次に削除します this.treeSetData.deleteList.forEach((item,i)=>{
    addFilter を this.treeSetData.addList.filter((value)=>value.id == item.id) とします。
    if(addFilter.length !== 0){
        this.treeSetData.deleteList = this.treeSetData.deleteList.filter((value)=>value.id !== item.id);
        this.treeSetData.addList = this.treeSetData.addList.filter((value)=>value.id !== item.id);
    }
})
// 最初に編集し、次にデータ統合を削除します this.treeSetData.deleteList.forEach((item,i)=>{
    editFilter を this.treeSetData.editList.filter((value)=>value.id == item.id) とします。
    (editFilter.length !== 0)の場合{
        this.treeSetData.editList = this.treeSetData.editList.filter((value)=>value.id !== item.id);
    }
})

ツリーコンポーネントスタイル

<スタイル lang="less">
.el-メッセージボックス {幅: 450px;}
.button-style {パディング: 0px}
.input-style {高さ: 15px;幅: 140px;}
.パネル本体を通して{
  パディング上部:12px;
  幅: 100%;
  ディスプレイ: フレックス;
  .パネルエリア左 {
    位置: 相対的;
    幅: 360ピクセル;
    境界線:2px実線rgba(240,240,240,1);
    境界線の半径: 5px;
    .head-title {
        display:flex;justify-content: space-between;padding:10px 10px;
        h5{左境界線:solid 3px #FB8742;左パディング:5px;高さ: 20px;行の高さ:20px;フォントサイズ:16px;}
    }
    .エリアツリー{
        幅: 100%;
        .treeスタイル{
            マージン: 0px 0px 10px 10px;
            高さ:88%;
            オーバーフロー-y: 自動;
        }
        .el-tree-node__content { 
            パディング左: 10px;ディスプレイ: flex;幅: 100%; 
            .tree-span {
                表示: flex; 幅: 100%; 
                .tree_node_op {
                    左余白: 10px;色: #D3D3D3;
                }
            }
        }
    }
    .add_question {
        マージン: 10px 0px;
    }
    .foot-style{
        パディング右:5px; 
        高さ: 40px;
        テキスト配置: 右;
    }
  }
  .パネルエリア右 {
    右マージン: 5px;
    幅: 100%;
    左パディング: 15px;
    高さ: 100%;
    .el-行 {
      幅: 100%;
      ディスプレイ: フレックス;
      コンテンツの両端揃え: スペースの間;
      .located-class {
        幅: 50%;
      }
      .デバイスフロアクラス {
        幅: 50%;
        ディスプレイ: フレックス;
        コンテンツの端揃え: flex-end;
      }
    }
  }
}
</スタイル>

これで、Vue でツリー構造の追加、削除、変更、クエリを実装するためのサンプルコードに関するこの記事は終了です。Vue のツリー構造の追加、削除、変更、クエリに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

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

<<:  MySQL 5.x の文字化け問題の解決方法

>>:  Docker Swarmの概念と使用法の詳細な説明

推薦する

Win10 DVWA のダウンロード、インストール、構成のグラフィック チュートリアルの詳細な説明 (初心者向け学習侵入)

コンピュータ システムが再インストールされ、侵入テスト学習環境 DVWA を再インストールする必要が...

CSS 読み込み効果の実装 パックマン

えーっと、名前はただの推測です 2333序文これは練習用の CSS デモです。何か間違っている点があ...

Docker 構成コンテナの場所とヒントのまとめ

Docker の使用に関するヒント1. 停止したDockerコンテナをすべてクリーンアップする停止し...

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

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

アイデアをDockerに接続してワンクリックでデプロイする方法

1. docker設定ファイルを変更し、ポート2375を開きます。 [root@s162 docke...

Springboot および Vue プロジェクトの Docker デプロイメントの実装手順

目次A. SpringbootプロジェクトのDockerデプロイメント1. Springbootプロ...

Redis を Docker コンテナとして素早くデプロイする方法

目次はじめるデータストレージサーバーを構成するRedis セキュリティの管理Redisインストールの...

VueはAmapを使用して都市の位置特定を実現

この記事では、Amapを使用して都市の位置特定を実現するVueの具体的なコードを参考までに共有します...

MySQL GTID の総合概要

目次01 GTIDの紹介02 GTIDの仕組み03 GTIDの利点と欠点04 テスト環境構築05 テ...

yum から docker インストール パッケージをダウンロードし、オフライン マシンにインストールする例の詳細なコード

1. ネットワークマシンでは、デフォルトのcentosyumソースを使用します [root@kole...

MySQL 5.7 クラスタ構成手順

目次1. サーバーAのmy.cnfファイルを変更する2. サーバーBのmy.cnfファイルを変更する...

count(1)、count(*)、count(列名)の実行の違いの詳細な説明

実施効果: 1. count(1) と count(*)テーブル内のデータ量が多い場合、テーブルを分...

VMware ESXi サーバー仮想化クラスター

目次まとめ環境とツールの準備サーバー仮想化のインストール VMware ESXi仮想マシンのオペレー...

Linux の Makefile とは何ですか? どのように機能しますか?

この便利なツールでプログラムをより効率的に実行およびコンパイルしますMakefile は自動コンパイ...

VMware Workstation 15 Pro に Ubuntu 1804 をインストールするチュートリアル (画像とテキスト付き)

このメモはインストール チュートリアルです。実用的な意味はありません。記録のためだけに書いています。...