Vue+element はローカル検索機能付きのドロップダウン メニューを実装します

Vue+element はローカル検索機能付きのドロップダウン メニューを実装します

必要:

バックエンドは配列オブジェクトを返し、それがフロントエンドで配列に結合されます。配列は名前に従って配列に結合され、バックエンドによって返された値が子として配列にプッシュされます。カスタム属性は、検索中に元の配列が変更されて配列をロールバックできなくなるのを防ぐために、配列内のデータをバックアップするために使用されます。

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

複数のページが同じインターフェースを使用するため、ここではVuexストレージが使用される。そのため、リクエストを繰り返す必要がない。
src\ストア\モジュール\メタデータ.js

/*
 * @著者: あなたの名前
 * @日付: 2021-09-02 15:46:45
 * @最終編集時間: 2021-09-16 17:39:53
 * @LastEditors: LastEditorsを設定してください
 * @Description: コンソール - データ アクセス - フローティング メニュー* @FilePath: \vue-ui\src\store\module\metadata.js
 */
/**
 * データリソース管理フローティングメニューデータ */

'element-ui' から { Loading, Message } をインポートします
'@/plugins/ajax' から { apiManager } をインポートします。

インスタンスをロードする
定数状態 = {
    全リスト: [],
    ナビリスト: [],
    名前: {}
}
const 変異 = {
    SET_NAVLIST: (状態、リスト) => {
        // ページ検索エラーを防ぐためにディープコピーを使用する state.navList = list.map(item => {
            if (item.children) {
                item.backList = JSON.stringify(item.children)
            }
        })
    },
    SET_ALLLIST: (状態、リスト) => {
        state.allList = リスト
    },
    SET_NAME: (状態、オブジェクト) => {
        オブジェクト.assign(状態.名前, obj)
    }
}
定数アクション = {
    リクエストメタデータ({コミット、状態}、{名前、navList}) {
        新しいPromiseを返します(resolve => {
            const nameKey = Object.keys(state.name)
            nameKey.indexOf(name) !== -1 の場合 {
                //重複リクエストを防ぐresolve(state.name[name])
            } それ以外 {
                loadingInstance = Loading.service()
                state.name[名前] = 名前
                apiマネージャー
                    .post('/metadata/tableInfo/query')
                    .then(res => {
                        コミット('SET_ALLLIST', res.data)
                        (res.data内のconst i) {
                            const item = navList.find(v => v.name === i) //渡された名前と返されたキー(name)を一致させて、if (item) {
                                item.children = res.data[i] // 要求された各オブジェクトの下の配列を対応するItem.childrenに戻します。item.navSearch = ''
                                item.backList = [] //検索中に元の配列が変更されないようにバックアップを作成します}
                        }
                        コミット('SET_NAVLIST', navList)
                        コミット('SET_NAME', { [name]: navList })
                        解決(navList)
                        ロードインスタンスを閉じる()
                    })
                    .catch(エラー => {
                        解決する([])
                        ロードインスタンスを閉じる()
                        メッセージ.エラー(err)
                    })
            }
        })
    }
}

エクスポートデフォルト{
    名前空間: true、
    州、
    突然変異、
    アクション
}

ページの親コンポーネントは子コンポーネントを使用します
src\views\console\dataAccessManage\dataResourceTable\FileXs.vue

 <transition name="コンポーネントフェード" mode="アウトイン">
   <フローティングメニュー v-show="isCollapse" :newList='navList' @getDatails='getDatails' />
</トランジション>
データ() {
      戻る {
          ナビリスト: [
              {
                  画像ソース: require('./../../../../../public/images/m6.png'),
                  名前: 'ftp',
                  タイプ名: 'FTP サーバー',
                  子供たち: []、
                  合計: 0
              },
              {
                  画像ソース: require('./../../../../../public/images/m5.png'),
                  名前: 'txt',
                  タイプ名: 'ファイルサーバー',
                  子供たち: []、
                  合計: 0
              }
          ]、
          
   },
  非同期マウント() {
    定数パラメータ = {
        名前: 'fileXs',
        navList: this.navList
    }
    // vuex をリクエストする
    this.navlist = this.$store.dispatch('metadata/requestMetadata', param) を待機します
},

サブコンポーネント
src\views\console\dataAccessManage\components\floatingMenu.vue

<!--
 * @著者: あなたの名前
 * @日付: 2021-09-02 14:01:58
 * @最終編集時間: 2021-09-16 17:43:10
 * @LastEditors: LastEditorsを設定してください
 * @Description: データ リソース テーブル内のフローティング メニュー* @FilePath: \vue-ui\src\views\console\dataAccessManage\components\floatingMenu.vue
-->
<テンプレート>
    <div class="data-sheet-main__nav" v-if="sjktcList.length || newList.length">
        <div>
            <div class="nav__item" v-for="(item,index) in sjktcList" :key="'info2-' + index">
                <div class="item_name sjk_name" :class="{ sjk_active: sjkActive == index }" @click="sjktcShow(item.type,index)">{{item.typeName}}</div>
            </div>
        </div>
        <!-- ファイル -->
        <el-collapse class="nav__item" v-model="activeNames">
            <el-collapse-item class="item_name" :title="item.typeName" :name="item.typeName" v-for="(item,index) in newList" :key="index">
                <ul class="nav__item__list">
                    <li class="list__li">
                        <el-input v-input-val-bg v-model="item.navSearch" @input="handleNavSearch(item)" prefix-icon="el-icon-search" size="mini" placeholder="キーワードを入力してください" clearable></el-input>
                    </li>
                    <li v-for="(key,i) in item.children" :key="i" :class="{ 'list__li--active': key.id == dbId }" class="list__li" @click="getDatails(key,item)">
                        <span :title="キー名" class="list--title">{{キー名}}</span>
                        <span class="list--count">{{key.total || 0}}</span>
                    </li>
                    <li class="no-data" v-if="!item.children.length">データなし</li>
                </ul>
            </el-collapse-item>
        </el-collapse>
    </div>
</テンプレート>
<スクリプト>
'@/utils' から { debounce } をインポートします
エクスポートデフォルト{
    名前: 'フローティングメニュー',
    小道具: {
        sjktcリスト: {
            タイプ: 配列、
            デフォルト: () => []
        },
        新しいリスト: {
            タイプ: 配列、
            デフォルト: () => []
        }
    },
    コンポーネント: {},
    データ() {
        戻る {
            sjkアクティブ: 0,
            nav検索: '',
            navChildData: [],
            データベースID: ''、
            アクティブ名: []
        }
    },
    マウント() {
    },
    メソッド: {
        // リスト内のコンテンツをクリックする getDatails(args, db) {
            this.dbId = args.id
            this.$emit('getDatails', { args, db })
        },
        // eslint は関数の括弧の前に次の行のスペースを無効にします
        handleNavSearch:debounce(関数(obj) {
            this.$forceUpdate()//入力ボックスの割り当て失敗を防ぐ const currlist = JSON.parse(obj.backList)
            obj.navSearch == ''の場合{
                obj.children = カレントリスト
            } それ以外 {
                obj.children = currlist.filter(item => {
                    item.name.toLowerCase().indexOf(obj.navSearch.toLowerCase()) != -1 を返します
                })
            }
        }, 100),
        sjktcShow(タイプ、i) {
            this.sjkアクティブ = i
            this.$emit('sjktcShow', [タイプ])
        }
    },
    時計:
        新しいリスト: {
            深い:本当、
            ハンドラ(リスト) {
                if (リスト) {
                    // デフォルトでは、展開されたリストの下の 0 個のメニューがアクティブになります for (let i = 0; i < list.length; i++) {
                        const 項目 = リスト[i]
                        if (!this.dbId && item.children.length) {
                            this.activeNames = アイテム.typeName
                            this.getDatails(item.children[0], item) //最初のデータコンテンツのデフォルトリクエスト}
                    }
                }
            }
        }
    }
}
</スクリプト>
<style lang='scss' スコープ>
.data-sheet-main__nav {
    幅: 180ピクセル;
    位置: 絶対;
    上: 0px;
    左: -190px;
    zインデックス: 100;
    背景: #fff;
    境界線: 1px 実線 #6579fe;
    パディング上部: 10px;
    .sjk_アクティブ{
        色: $theme !important;
    }
    .nav__item {
        位置: 相対的;
        下部マージン: 15px;

        .アイテム名 {
            幅: 100%;
            表示: インラインブロック;
            左パディング: 17px;
            フォントサイズ: 14px;
            行の高さ: 24px;
            色: rgba(0, 0, 0, 0.85);
            /deep/.el-collapse-item__header {
                フォントの太さ: 太字;
                下部境界線: なし;
                位置: 相対的;
                左パディング: 15px;
                .el-collapse-item__arrow {
                    位置: 絶対;
                    左: 0;
                    変換: 回転(270度);
                }
                .el-collapse-item__arrow.is-active {
                    変換: 回転(90度);
                }
            }

            &:ホバー{
                カーソル: ポインタ;
            }
        }
        .データなし{
            テキスト配置: 中央;
            色: #999;
            パディング: 10px 0;
            幅: 100%;
        }
        画像 {
            幅: 100%;
            高さ: 50px;
        }
        .nav__item--合計 {
            位置: 絶対;
            表示: ブロック;
            幅: 30ピクセル;
            高さ: 30px;
            背景: #fff;
            境界線: 1px 実線 #ccc;
            境界線の半径: 50%;
            行の高さ: 30px;
            境界線: 1px実線 #71b1ec;
            ボックスの影: 0 3px 6px #156d90;
            テキスト配置: 中央;
            色: #fd0b0b;
            フォントサイズ: 16px; /*いいえ*/
            上: 0;
            右: 0;
            変換: translate(25%, -20%);
        }
        .nav__item__list {
            ディスプレイ: フレックス;
            最大高さ: 246px;
            オーバーフロー-y: 自動;
            flex-wrap: ラップ;

            .list__li {
                幅: 100%;
                上マージン: 5px;
                行の高さ: 30px;
                パディング: 0 6px 0 17px;
                位置: 相対的;
                カーソル: ポインタ;
                色: #333;
                &:ホバー{
                    色: $blue;
                }
                .list--タイトル{
                    幅: 90ピクセル;
                    オーバーフロー: 非表示;
                    テキストオーバーフロー: 省略記号;
                    空白: ラップなし;
                    フロート: 左;
                    &:ホバー{
                        色: #409eff;
                    }
                }
                .list--count {
                    色: #46a0fc;
                    フロート: 右;
                }
            }
            .list__li--アクティブ{
                色: $blue;
            }
        }
    }
    /deep/.el-collapse {
        上境界線: なし;
    }
}
.データシートメイン__リスト {
    フレックス: 1;
    左マージン: 20px;
    .リストヘッダー{
        flex-direction: 列;

        。注文 {
            テキスト配置: 右;
            {
                背景: #6579fe;
                フォントファミリ: PingFangSC-Regular;
                フォントサイズ: 12px;
                行の高さ: 22px;
                色: #ffffff;
                パディング: 6px;
                境界線の半径: 4px;
            }
        }
    }
    .handler--右固定 {
        パディング: 25px 10px;
    }
    .nodata {
        テキスト配置: 中央;
        フォントサイズ: 16px;
    }
}
</スタイル>

これで、vue+element を使用してローカル検索機能付きのドロップダウン メニューを実装する方法についての記事は終了です。vue element ドロップダウン メニュー検索に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3+Element+Tsは、フォームの基本的な検索リセットやその他の機能を実装します
  • Vue+elementuiはドロップダウンテーブルの複数選択と検索機能を実現します
  • Vue elementuiは、検索バーのパブリックコンポーネントのカプセル化のサンプルコードを実装します。
  • Vue+Elementは検索キーワードの強調表示機能を実現
  • Vue 要素のグループ化 + 複数選択 + 検索可能な Select セレクタの実装例
  • vue + 要素を使用してテーブルページングとフロントエンド検索を実装する方法
  • vue Element-ui 入力リモート検索と変更提案表示テンプレートのサンプルコード
  • VUE+要素開発背景管理検索機能

<<:  MySQLのREDOログ(リドゥログ)とロールバックログ(アンドゥログ)の詳しい説明

>>:  Linux ipcsコマンドの使用

推薦する

vue3 キャッシュページキープアライブと統合ルーティング処理の詳細な説明

目次1. はじめに2. 使用1. vue2とvue3の違い2. ページ上の一部のデータはキャッシュす...

MySQL サーバー 5.7.20 のインストールと設定方法のグラフィック チュートリアル

この記事ではMySQL 5.7.20のインストールと設定方法を記録し、皆さんと共有します1. MyS...

js ドラッグ アンド ドロップ テーブルでコンテンツ計算を実現する

この記事の例では、コンテンツの計算を実現するためのjsドラッグアンドドロップテーブルの具体的なコード...

Dockerでイメージをプルするための手順を完了する

1. Docker pullはイメージをプルします$ docker pull {IMAGE_NAME...

ページネーションの例とベストプラクティス

<br />構造と階層により複雑さが軽減され、読みやすさが向上します。記事やサイトが整理...

Google 翻訳ツール: 多言語ウェブサイトを素早く実装

Google Chinaは、ウェブサイトやブログを素早く簡単に多言語化できる翻訳ツールをリリースした...

JS を使用して航空機戦争の小さなゲームを実装する

この記事の例では、参考のために航空機戦争ゲームを実装するためのJSの具体的なコードを共有しています。...

Vue2.0/3.0 での provide と inject の使用例

目次1. provide/inject の用途は何ですか? 2. provide/injectの使い...

SQL文のANDとORの実行順序で発生する問題

質問昨日、データベースSQLを書いているときに問題が発生しました。問題の根本は、SQL ステートメン...

WindowsシステムでPhPStudy MySQLの起動に失敗する問題を解決する

エラーを報告するApache\Nginx サービスは正常に起動しましたが、MySQL は起動に失敗し...

VMware Workstation 14 Pro インストール Ubuntu 16.04 チュートリアル

この記事では、VMware Workstation14 ProにUbuntu 16.04をインストー...

mysql5.7.33 で誤って ibdata ファイルを削除した後にデータを回復する方法

目次1. シナリオの説明: 2. 事例のデモンストレーション: 2.1. MySQLの障害発生前にデ...

純粋なCSSでデジタルプラスとマイナスボタンを実装するための最適なソリューション

序文:デジタル加算ボタンと減算ボタンの実装には、次のような多くのソリューションがこれまでに使用されて...

JS addEventListener() およびattachEvent() メソッドは登録イベントを実装します

JavaScript の DOM イベント モデルでは、オブジェクトの addEventListen...