序文今日、プロジェクトを作成しているときに、カスタムの右クリック メニューが必要になることに気付きました。メニューにはサブメニューがあるので、このときは再帰コンポーネントが使用されます。そこで、再帰コンポーネントの作成プロセスを記録するためにこの記事を書きました。 1. 再帰コンポーネント再帰コンポーネントは、その名前が示すように、コンポーネント自体の中で自分自身を呼び出します。そこで、まずコンポーネントを構築し、その中で自分自身を呼び出します。一般的な再帰コンポーネントは、私たちのプロジェクトでよく使用されるツリー コンポーネントです。以下は、プロジェクト要件を満たすために実装した再帰コンポーネントのソース コードです。 <テンプレート> <ul class="リストコンテナ"> <li v-for="(item,index) in listData" :key="インデックス" class="リスト項目" @click.prevent.stop="handleClick($event,item)" @mouseover="childrenMenuIndex=インデックス" > <span class="list-item_span"> {{item.text}} </span> <CaretRightOutlined v-if="item.children" /> <!-- 自分自身を呼び出すかどうかを決定する --> <div v-if="item.children&&childrenMenuIndex===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 childrenMenuIndex=ref(-1); const eventNames=['クリック','コンテキストメニュー']; マウント時(()=>{ イベント名.forEach(イベント名=>window.addEventListener(イベント名、hideContextMenuEvent)) }) マウント解除前に(()=>{ イベント名.forEach(イベント名=>window.removeEventListener(イベント名、hideContextMenuEvent)) }) 戻る { ハンドルクリック、 子メニューインデックス、 コンテキストメニューイベントを非表示にする } } }) </スクリプト> 予防
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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL のデータ型とスキーマの最適化の詳細な説明
>>: Spring Cloud での Docker デプロイメントに jib を使用する詳細な手順
最近では、特定のフォルダ内の特定のファイルを自動的に検索する必要があり、ファイルパスとファイル名を別...
フォーム検証は、フロントエンド開発プロセスで最もよく使用される機能の 1 つです。私の個人的な仕事経...
1. MySQL にログインし、SHOW VARIABLES LIKE 'character...
整合性制約整合性制約はテーブル データの正確性を保つためのものです。データが正しくない場合は、そもそ...
Web デザインにおけるツリーとは何ですか?簡単に言うと、リンクをクリックするとサブディレクトリが展...
目次1. redux とは何ですか? 2. 還元の原則3. redux の使い方は? (1)redu...
この記事では、MySQL の null (IFNULL、COALESCE、NULLIF) に関連する...
今日は、すべてのブラウザ (主に IE 9 以上と Chrome) と互換性のある自分のホームページ...
簡単な説明<br />IE6および7では、一般的なaタグ(HTMLで記述され、DOM操作...
CocosCreatorがスキルCD効果を実現多くのゲームにはスキルがあります。プレイヤーがスキルボ...
1. シェルスクリプトを作成する vim バックアップdb.sh 次のようにスクリプトを作成します。...
同僚からよく聞かれるのですが、ファイル/ディレクトリを削除すると「操作は許可されていません」というエ...
序文MySQL 5.7.11 以降、MySQL は、別の表領域に格納された InnoDB テーブルの...
ページをレイアウトする際、ユーザーに異なる視覚効果を与えるために、div の背景色を半透明の状態に設...
1. ElasticSearch 6.4.1 インストール パッケージを次の場所からダウンロードしま...