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の概念と使用法の詳細な説明

推薦する

CentOS 7 で grub パスワードと単一ユーザー ログインを設定するサンプル コード

Centos7 と Centos6 では、GRUB パスワードの設定手順に大きな違いがあります。これ...

フォーム送信ページの更新がジャンプしない

1. ソースコードの設計コードをコピーコードは次のとおりです。 <!DOCTYPE html ...

PHP+nginx サービス 500 502 エラーのトラブルシューティングのアイデアの詳細な説明

概要オンラインサービスへのアクセス中に 500 または 502 エラーが発生した場合、緊急処理とトラ...

Docker nginx + https サブドメイン設定の詳細なチュートリアル

今日はたまたま友人のサーバーの移転を手伝うことになり、サーバーの基本的な設備の設定を行ったのですが、...

ZabbixはPSK共有キーを使用してサーバーとエージェント間の通信を暗号化します。

Zabbix バージョン 3.0 以降、Zabbix サーバー、Zabbix プロキシ、Zabbi...

HTML+CSS でハートビートの特殊効果を作成する

今日は、シンプルなハートビート効果を作成します。多くのコードは必要ありません。ボックスを追加し、CS...

JavaScript 関数のパフォーマンスを測定するさまざまな方法の比較

目次概要パフォーマンス.nowコンソール.time時間精度を短縮注意事項分割して征服する入力値に注意...

MySQL 8.0.14 のインストールと設定方法のグラフィックチュートリアル (一般)

MySQLサービス8.0.14のインストール(一般)の参考までに、具体的な内容は次のとおりです。イ...

MySQL で制限を使用するとパフォーマンスに影響するのはなぜですか?

まず、MySQL のバージョンについて説明します。 mysql> バージョンを選択します();...

nginxコンテナ設定ファイルの独立した実装

コンテナを作成する [root@server1 ~]# docker run -it --name ...

React Hook の使用例 (一般的なフック 6 つ)

1. useState: 関数コンポーネントに状態を持たせる使用例: // カウンター impor...

this.parentNode.parentNode (親ノードの親ノード) はどういう意味ですか?

親ノードの親ノード、例えば、このような段落がありますHTML:コードをコピーコードは次のとおりです。...

PXEを使用してLinuxシステムを自動的に展開する方法

目次背景DHCPの設定DHCP ファイル (動的ホスト構成プロトコル) の編集tftp 設定sysl...

エレガントなJSコードの書き方

目次変数意味があり発音しやすい変数名を使用する同じ型の変数には同じ語彙を使用する検索可能な名前を使用...

MySQL でデータベースを作成した後、ユーザー 'root'@'%' によるデータベース 'xxx' へのアクセスが拒否される問題を解決する

序文最近、仕事で問題が発生しました。データベースを作成した後、データベースに接続するときにエラーが発...