序文今日、プロジェクトを作成しているときに、カスタムの右クリック メニューが必要になることに気付きました。メニューにはサブメニューがあるので、このときは再帰コンポーネントが使用されます。そこで、再帰コンポーネントの作成プロセスを記録するためにこの記事を書きました。 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 を使用する詳細な手順
この記事では、淘宝虫眼鏡効果を実現するためのJavaScriptの具体的なコードを参考までに紹介しま...
トイ・ストーリー3 オンラインマーケティングウェブサイトゼンモバイル鉄から鉄へスプラウトファンドバー...
CUDA インストール cuda をダウンロードサポートされているcudaバージョンを表示するには...
リレーショナル データベースでは、悲観的ロックと楽観的ロックがリソース同時実行シナリオのソリューショ...
最初の解決策は、イメージを公開イメージリポジトリにプッシュし、それをプルダウンすることです。 2 番...
Centos にプロジェクトをデプロイするときに奇妙な問題が見つかりました。データベース接続で例外...
この記事では、MySQL ストアド プロシージャの使用方法について説明します。ご参考までに、詳細は以...
目次ネットワーク構成を表示するネットワークインターフェース情報を表示する---ifconfigルーテ...
mysql が正常に実行されている場合、テーブル構造を表示することは難しくありません。しかし、場合...
目次序文変換関係具体的な実装file2DataUrl(ファイル、コールバック) file2Image...
1. インストールスクリプト(composer-setup.php)を現在のディレクトリにダウンロー...
1. Nginxの同時実行性を最適化する [root@proxy ~]# ab -n 2000 -c...
目次1. WeChat Payを開く1.1 アフィリエイト加盟店番号1.2 加盟店番号を追加する1....
導入前回の記事では、axios のシンプルなカプセル化と、axios インターセプターの適用シナリオ...
特定の期間内に特定の IP へのアクセス回数を制限する方法は、特に悪意のある DDOS 攻撃に直面し...