序文今日、プロジェクトを作成しているときに、カスタムの右クリック メニューが必要になることに気付きました。メニューにはサブメニューがあるので、このときは再帰コンポーネントが使用されます。そこで、再帰コンポーネントの作成プロセスを記録するためにこの記事を書きました。 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 を使用する詳細な手順
CSS 属性セレクターは素晴らしいです。大量のクラス名を追加することを回避し、コード内の問題を指摘す...
1.1 一般的なマーキング一般的なタグは開始タグと終了タグで構成されます。構文は次のとおりです: ...
前の単語line-height、font-size、vertical-align は、インライン要素...
最初のステップは、アイコン作成ソフトウェアを準備することです。まず、いわゆるアイコンは拡張子 .ic...
<br />原文: http://blog.rexsong.com/?p=1166ウェブ...
目次ウェブAPI DOM DOMツリーDOM要素取得方法ドキュメントオブジェクトのプロパティイベント...
日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...
Linuxシステムでサービスの起動とシャットダウンを構成する1. コマンドcd /etc/init....
データベースはさておき、人生における方言とは何でしょうか?方言とは、ある場所特有の言語です。他の場所...
HTML5 で contentEditable 属性が導入されて以来、div は textarea ...
1. docker imagesを使用して、このマシン上のすべてのイメージファイルを表示します。 2...
現在、WeChatパブリックアカウントの運用活動が多く、写真を生成する必要があります。生成された写真...
VUE は vue-seamless-scroll を使用して、自動的にスクロールしていいねします。...
困り果てて、ふと、私がよく行くSinaのタッチスクリーン版はどうやって作られているのだろう?と考えま...
スライドショーは Web ページでよく見られます。美しい写真が使われています。こちらは純粋な CSS...