vue3 再帰コンポーネントカプセル化の全プロセス記録

vue3 再帰コンポーネントカプセル化の全プロセス記録

序文

今日、プロジェクトを作成しているときに、カスタムの右クリック メニューが必要になることに気付きました。メニューにはサブメニューがあるので、このときは再帰コンポーネントが使用されます。そこで、再帰コンポーネントの作成プロセスを記録するためにこの記事を書きました。

1. 再帰コンポーネント

再帰コンポーネントは、その名前が示すように、コンポーネント自体の中で自分自身を呼び出します。そこで、まずコンポーネントを構築し、その中で自分自身を呼び出します。一般的な再帰コンポーネントは、私たちのプロジェクトでよく使用されるツリー コンポーネントです。以下は、プロジェクト要件を満たすために実装した再帰コンポーネントのソース コードです。

<テンプレート>
   <ul class="リストコンテナ">
       <li v-for="(item,index) in listData" 
            :key="インデックス" class="リスト項目" 
            @click.prevent.stop="handleClick($event,item)"
            @mouseover="childrenMenuInde​​x=インデックス"
            >
           <span class="list-item_span">
               {{item.text}}
           </span>
           <CaretRightOutlined v-if="item.children" />
           <!-- 自分自身を呼び出すかどうかを決定する -->
           <div v-if="item.children&&childrenMenuInde​​x===index"
            クラス="コンテキストメニューコンテキストメニュー_children"
           >
            <!-- コンポーネント自体を呼び出す -->
            <list-comp :list-data='item.children' @hideContextMenu='hideContextMenuEvent' />
           </div>
       </li>
   </ul>
</テンプレート>
<スクリプト>
「vue」からdefineComponent、refをインポートします。
'@ant-design/icons-vue' から {CaretRightOutlined} をインポートします。
エクスポートデフォルトdefineComponent({
    名前:'リストコンプ',
    小道具:{
        リストデータ:{
            タイプ:配列、
            デフォルト:()=>[]
        }
    },
    コンポーネント:{
        右矢印
    },
    放出:
        「コンテキストメニューを非表示」
    ]、
    セットアップ(props,{emit}){
    	//クリックイベント const handleClick=(event,{text,callBack})=>{
            出力('コンテキストメニューを非表示');
            //callBack は渡されたコールバック関数です。渡された場合、カスタムコールバック関数が呼び出されます if (callBack) {
                折り返し電話();
                戻る;
            }
        }
        const コンテキストメニューイベントを非表示にする=()=>{
            出力('コンテキストメニューを非表示');    
        }
        //現在選択されているメニュー項目を識別するために使用されます const childrenMenuInde​​x=ref(-1);
        const eventNames=['クリック','コンテキストメニュー'];
        マウント時(()=>{ 
            イベント名.forEach(イベント名=>window.addEventListener(イベント名、hideContextMenuEvent))
        })
        マウント解除前に(()=>{
            イベント名.forEach(イベント名=>window.removeEventListener(イベント名、hideContextMenuEvent))
        })
        戻る {
            ハンドルクリック、
            子メニューインデックス、
            コンテキストメニューイベントを非表示にする
        }
    }
})
</スクリプト>

予防

  • 再帰コンポーネント自体の内部では、自分自身を呼び出すときに、再帰コンポーネント上の emitting を介して自分自身が送信したカスタム イベントを受信する必要があります。受信後、コンポーネント内の emitting を介して再度カスタム イベントをトリガーします。
  • クリック イベントをリッスンすることで、emit を通じてカスタム イベントをトリガーし、コンポーネントの外部でリッスンすることができます。また、props を通じてコン​​ポーネントにデータを渡すときにコールバックを自分で構築することもできるため、emit を通じてカスタム イベントをトリガーする必要はありません。
  • 再帰コンポーネント内のメニュー項目をクリックしたときは、再帰コンポーネントを破棄する必要があります。必要なのは、再帰コンポーネント内でイベント バブリングを介してクリック、コンテキスト メニューなどのイベントをリッスンしてコンポーネントを破棄し、外部が受信できるように、emit を介してカスタム イベントをトリガーして、コンポーネントを破棄するという目的を達成することだけです。
  • 再帰コンポーネント内でクリック イベントを呼び出す場合は、イベントのバブリングとデフォルト イベントを防止する必要があります。クリック イベントの後に click.prevent.stop を追加すると、イベントのバブリングとデフォルト イベントを防ぐことができます。

2. 右クリックメニューコンポーネント

私のプロジェクトでは、コンポーネントを使用して右クリック メニューを実装します。もちろん、プラグインを通じて実装することもできます。ここでの右クリック メニューは、本質的には再帰コンポーネントの二次カプセル化です。実際、二次カプセル化は必要ありません。再帰コンポーネントを右クリック メニューとして直接使用できます。

<テンプレート>
    <テレポート先 = 'body' >
        <div class="content-menu_container" :style="styleObj">
            <リスト要素 
                :list-data='メニューデータ'
                @hideContextMenu='windowClickHandler'
             />
        </div>
    </テレポート>
</テンプレート>
<スクリプト>
「vue」からdefineComponentをインポートします。
「./list-comp.vue」からListCompをインポートします。
エクスポートデフォルトdefineComponent({
    名前:"コンテキストメニュー",
    コンポーネント:{
        リストコンプ
    },
    小道具:{
        スタイルオブジェクト:{
            タイプ:オブジェクト、
            デフォルト:()=>{}
        },
        メニューデータ:{
            タイプ:配列、
            デフォルト:()=>[]
        }
    },
    出力:['closeContextMenu'],
    セットアップ(props,{emit}){
        定数windowClickHandler=()=>{
            出力('コンテキストメニューを閉じる')
        };
        戻る {
            ウィンドウクリックハンドラ、
        }
    }
})
</スクリプト>

予防

プロジェクト内で右クリック メニューを呼び出す場合は、まずウィンドウ自体の右クリック メニュー イベントを無効にする必要があります。次に、独自のカスタム メニュー イベントを実装します。実装コードを以下に示します。

const showContextMenu=(イベント)=>{
    // デフォルトのイベントを無効にしてバブルを防止します。event.stopPropagation();
    イベントをデフォルトにしない();
    状態.showContextMenu=true;
    状態.styleObj={
      左:event.clientX+ "px",
      上:event.clientY+'px'
    }
  }
  //ウィンドウ自体の右クリックメニューイベントを監視する onMounted(()=>{
    window.addEventListener('コンテキストメニュー',showContextMenu)
  })
  マウント解除前に(()=>{
    window.removeEventListener('コンテキストメニュー',showContextMenu)
  })

要約する

これで、vue3 再帰コンポーネント カプセル化に関するこの記事は終了です。vue3 再帰コンポーネント カプセル化に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3+TypeScriptは再帰メニューコンポーネントの完全な例を実装します
  • ツリー メニューを実装するための Vue.js 再帰コンポーネント (例の共有)
  • Vuejsは再帰コンポーネントを使用してツリーディレクトリを実装します
  • Vue.js 再帰コンポーネントの学習
  • ツリーメニューを実装するための Vue2 再帰コンポーネント
  • Vue3 再帰コンポーネントの使い方を 10 分で学ぶ

<<:  MySQL のデータ型とスキーマの最適化の詳細な説明

>>:  Spring Cloud での Docker デプロイメントに jib を使用する詳細な手順

推薦する

よく使われるCSSスタイル(レイアウト)の詳しい説明

新しいCSS3プロパティと互換性ありCSS3では、プラグインprefixfree.min.jsを使用...

iOS、Android、ミニプログラムアプリの敷居の低い開発のためのフロントエンドフレームワークを詳しく解説

現在、クロスプラットフォーム開発技術はもはや新しい話題ではありません。市場にはいくつかのオープンソー...

Kafka と Nginx の統合例

背景nginx-kafka-module は、Kafka を nginx に統合して、Web プロジ...

win10 での mysql5.7.21 の詳細なインストール手順

この記事では、MySQL 5.7.21のインストールとインストール中に発生した問題を参考までに紹介し...

CSSで検索ボックスを非表示にする機能を実装します(アニメーション順方向と逆方向のシーケンス)

上部のメニュー バーに検索ボックスを配置するのは一般的なシナリオですが、検索機能がそれほど頻繁に使用...

Windows で負荷分散に Nginx+Tomcat を使用するための完全な手順

序文今日は、Prince が Windows で負荷分散に Nginx + Tomcat を使用する...

HTML における水平および垂直の中央揃え方法の詳細な説明 (基礎)

序文馬を書いていたとき、水平方向と垂直方向の中央揃えの方法について、誰もあまり知らなかったと思います...

訪問者にあなたのウェブサイトを覚えてもらうための3つの便利なコード

訪問者があなたのウェブサイトを覚えておくのに役立つ3つの便利なコード。お気に入りに追加するためのヒン...

構造とプレゼンテーションの分離を理解するためのWeb標準の学習

Web 標準について議論するときに必ず話題になるのは、構造とプレゼンテーションを分離することの重要性...

Dockerでの接続例外中のエラーを解決する

Docker を初めて使い始めると、通常とは異なる問題に遭遇して、必然的に混乱してしまいます。大丈夫...

Vue3 (III) ウェブサイトホームページレイアウト開発

目次1. はじめに2. 実際の事例1. App.vueを変更する2. レイアウトを調整する3. ジャ...

MySQL クエリ フィールド タイプが json の場合の 2 つのクエリ メソッド

テーブル構造は次のとおりです。 id varchar(32) 情報JSONデータ: id = 1 i...

Vue+Openlayer をベースに geojson を動的に読み込む方法

1つ以上の機能をロードする <テンプレート> <div id="map&...

MySQLサービスが起動しても接続されない問題の解決策

mysql サービスは開始されていますが、接続できません。この問題を解決するにはどうすればよいでしょ...

ネイティブ js でカスタム スクロール バーを実装する

この記事の例では、カスタムスクロールバーを実装するためのjsの具体的なコードを参考までに共有していま...