序文今日、プロジェクトを作成しているときに、カスタムの右クリック メニューが必要になることに気付きました。メニューにはサブメニューがあるので、このときは再帰コンポーネントが使用されます。そこで、再帰コンポーネントの作成プロセスを記録するためにこの記事を書きました。 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 を使用する詳細な手順
新しいCSS3プロパティと互換性ありCSS3では、プラグインprefixfree.min.jsを使用...
現在、クロスプラットフォーム開発技術はもはや新しい話題ではありません。市場にはいくつかのオープンソー...
背景nginx-kafka-module は、Kafka を nginx に統合して、Web プロジ...
この記事では、MySQL 5.7.21のインストールとインストール中に発生した問題を参考までに紹介し...
上部のメニュー バーに検索ボックスを配置するのは一般的なシナリオですが、検索機能がそれほど頻繁に使用...
序文今日は、Prince が Windows で負荷分散に Nginx + Tomcat を使用する...
序文馬を書いていたとき、水平方向と垂直方向の中央揃えの方法について、誰もあまり知らなかったと思います...
訪問者があなたのウェブサイトを覚えておくのに役立つ3つの便利なコード。お気に入りに追加するためのヒン...
Web 標準について議論するときに必ず話題になるのは、構造とプレゼンテーションを分離することの重要性...
Docker を初めて使い始めると、通常とは異なる問題に遭遇して、必然的に混乱してしまいます。大丈夫...
目次1. はじめに2. 実際の事例1. App.vueを変更する2. レイアウトを調整する3. ジャ...
テーブル構造は次のとおりです。 id varchar(32) 情報JSONデータ: id = 1 i...
1つ以上の機能をロードする <テンプレート> <div id="map&...
mysql サービスは開始されていますが、接続できません。この問題を解決するにはどうすればよいでしょ...
この記事の例では、カスタムスクロールバーを実装するためのjsの具体的なコードを参考までに共有していま...